Effective PyCharm Transcripts
Chapter: Unit testing
Lecture: Testing failure conditions
Login or
purchase this course
to watch this video and the rest of the course contents.
0:00
When we look at our code here, both the tests and the actual program itself. The library. This core library.
0:07
It really works well when you go down the specified path, I'm supposed to be able to go and see if there's a table get it.
0:14
I'm supposed to be able to book a table but it's missing all of its error
0:18
handling. And one thing that I've learned over time is that when people are new
0:22
to programming they just focus on getting it started making sure the thing is supposed to
0:27
do. It does. But the real difference of polished software is that it deals
0:32
with data that's not correct inputs that are not valid situations that didn't make sense.
0:37
Like trying to book a table that already has been booked or trying to book a table that doesn't exist or something like that.
0:43
So what we're gonna do is going to write two more tests that verify that we're checking for those things. So let's go over here and write a test.
0:54
The first one says you can't book a table that doesn't exist. We want this to respond in a meaningful way. How are we going to do that?
1:04
We're just gonna go down here and say core right? There's a book a table. And if you look at what this value here is supposed to be it's a string.
1:12
So we're gonna come down here and let's give it some ID. That's not going to work. Right? So obviously this should fail.
1:20
What's going to happen. How should it fail? Should it return none should it raise an exception. I'm gonna go with raises exception.
1:26
Right? That's a pretty Python equate to go. In fact, if we go down here and look at book a table notice there's
1:34
a integer not found table unavailable error and all those kinds of things to the error
1:39
handling. An exception support should be there for us to do this. Right? Let's give it a run and see what happens.
1:45
Uh It didn't pass what is what is going on here? All right. So what we got was it this failed? And why did it fail? But an attribute error?
1:57
This is probably the most common error in all the Python attribute or none. Type object has no attribute is booked. This is not a meaningful error.
2:05
This is just our code crashing halfway through its method. That's what we did is we had no table.
2:10
Then we tried to book it and obviously if it doesn't exist, this is going to crash. So what we need to do is actually write some
2:18
tests in our code to check for this. For example, we should say if not table. What do we do? Let's raise an entity not found error.
2:30
All right. So that will avoid. If there's no table us getting that attribute error here, let's try that. Okay, It's still crashed.
2:37
What's going on. Let's see. Oh, perfect. We did get this core attribute not found error, but why did it crash? Well,
2:46
this comes down to how we're writing our test. What's supposed to happen here in a normal test. If there's an exception that's a failure.
2:54
But in one of these negative error condition tests, that's exactly what we want is a failure.
3:00
If there's not an error, it's like a double negative of testing. So what we can do is we can come over here and now notice so far
3:07
we've not even used pytest but now we can start working with py tests for its extra features and we can create a context manager.
3:15
So we say with pytest raises and then you specify the type of exception. Then anything that happens in there.
3:22
If it leaves us with block without raising that error, that is a error. That's a failed test. So that that's the double negative. So now if we run it,
3:31
let's see what happens. Boom, it passes. This one passes. Why? Because we said it must raise an error and guess what it did.
3:39
Let's do one more of these negative tests and that is that. You cannot book a already booked table. They were down here again. Let's get a table.
3:51
We'll go down the course a all tables Bracket zero. I'll just give us the first one quote up,
3:57
book the table the table id and actually let's again just to make sure so we
4:03
can make sure that we're not going to get one that's already booked as we want to make sure this works smooth every time.
4:12
So we're going to book the table and then we want to try to book at a second time. So we'll go to the flow of somebody,
4:19
books it not us and then later table id just like before this should be an error. Let's say this time. We want a core table unavailable error.
4:37
We like that. Okay, so this should work pretty easy. Let's go ahead and do a little time to clean up, make it run it failed again.
4:46
Why did it fail? Because it didn't match the double negative this time it did not raise any error and it did not raise that one in particular.
4:54
So let's go back in and see what's going on here. Book a table again. Look, it seems like we might have just double booked it,
5:02
it was booked before and now it's still booked. So we don't want to let that happen. We're gonna say if table dot is booked,
5:10
raise that error, Run our tests again. Hey, that did it now are two negative scenarios in our two positive scenarios pass
5:20
right? We cannot book a book table. We cannot book a non existent table but we can book one and there are some that could be booked beautiful.