#100DaysOfCode in Python Transcripts
Chapter: Days 10-12: Testing your code with pytest
Lecture: Mocking randomness / pytest-cov
Login or
purchase this course
to watch this video and the rest of the course contents.
0:00
Alright. Back to our guessing game. So, how do we want to test this program? Ideally, you want to test one function or functionality
0:09
in one pytest function. So let's start with the Get Random Number. I'm going to open a file test on the scoreguess.py.
0:21
Again, using pytest I have the convenience to not having to import any module to run the test. What I do need is to import the actual program.
0:30
So from guess import get random number and the game class. Now, one thing I want to show you in this video is how to
0:39
mock an object. Because Get Random Number, as you can see at the right, uses a random integer from start to end.
0:46
And random returns to something randomly every time. So how do you actually test that? And the way to do that in testing land is to mock an object.
0:55
And for this I'm just going to use the unittest patch method on the mock module because it's a perfect fit for this scenario.
1:06
So from unittest.mock, import patch. I actually need to import to random module because that's the one we're going to mock.
1:16
And you can use it as patch object and that's to random module. Just specify the function or method you want to patch. And then in your test function
1:36
you can pass in an argument and you can give that argument a fixed return value. And that's key because
1:43
instead of having random return something else every time you can give it a fixed value. So it's kind of an override of what randint() normally does
1:54
which is randomness. Now we're saying every time random gets called it gives us 17, and it makes that at least we can call our function,
2:03
which is get random number, and we know that it returns 17. Yeah, and this is pretty basic, but it should show you
2:12
how you can override certain things in your program you cannot really control and I have another example later
2:18
about the input function where we ask for user input, which is another area that can be anything, so you want to mock that out.
2:28
So with this code written, let's go back to the command line and run this test. And I'm using Control Z on a Mac with foreground to
2:36
toggle back and forth between my file editor and the terminal. And here I can just run pytest, and that's funny
2:45
because the previous example I put in a hello subdirectory and it's actually cool that we see this because
2:50
pytest is smart enough to look recursively for test files. So in this case it found two and ran them both.
2:58
So I'm going to move this out to somewhere else, because we now want to focus on the guessing game. And yeah it runs fine, and what I also want to see
3:09
from now on is how much coverage we have of our tests. So we installed pytest-cov and to use it was a bit of a
3:22
trial-and-error for me, but I found this syntax to work well for me. So I want a coverage report term missing coverage dot current directory.
3:32
And the term missing is cool because it starts to index all the-- okay, I actually have to give it something more specific
3:40
because it starts to look in my virtual environment. Alright, what I did was in the end moving the files into a subdirectory so we got our venv
3:48
and we got our guess new subdirectory with the script and the test file in there. And when I specify a subdirectory in the minus minus scuff
3:58
argument then it just rounds on our code, and what's cool about the missing argument is that it shows the lines in the code that are not having
4:06
test yet, which is of course is a lot because we just got started. But even so, we have 24 percent coverage so
4:12
we are up for a good start. And you can then map those lines back to the actual program so this is not tested 29. This is not tested, et cetera.
4:26
One final thing, as I use Vim I'm going to use the coverage command quite a lot so in my Vim RC, which I mapped to VRC to edit it,
4:36
I have a comma T which maps to save the file or run a command with the exclamation mark and then I run this command and I'm going to--
4:44
yeah, I think that's fine because we're going to work in the guess directory from now on and the venv is not sitting there
4:51
so the dot should work there. And we can confirm that by going into guess, run a test, run a coverage report with a dot. Yeah that's fine.
5:06
So when I'm writing my tests, I can just hit comma T, it saves the file and it runs my coverage. So that's a bit of Vim trick or shortcut
5:19
for Pycharm or another editor. There must be a similar way to do this but this is my way of running coverage with one keystroke in Vim.