This is Day 17 of the #100DaysOfPython challenge.
This post will use the FreezeGun library to demonstrate how to mock the
datetime.datetime.now return value to set up consistent test environments.
The repo code can be found on GitHub at
- Familiarity with Pipenv. See here for my post on Pipenv.
- Familiarity with JupyterLab. See here for my post on JupyterLab.
- My previous blog post Datetime In Python
- Familiarity with PyTest. See my blog post Python Unit Testing With PyTest for a start post.
The previous code will built on top of the code from Datetime In Python. The final repo is at okeeffed/hello-python-datetime.
For the sake of simplicity, we will operate as if we are building a brand new repo:
Let’s create the
hello-python-datetime directory and install the required dependencies.
At this stage, we are now ready to update our
main.py file and
src/datetimes.py to be up to par with what we need for testing.
Add the following to
Add the following to
python main.py should bring us up to par with the following:
The output matches up to us printing values out from
main.py. We are at a stage now where we are up to par and able to start writing tests.
Note: If you are using a virtual environment, you will need to run
pipenv shellto enter the virtual environment.
Exploring FreezeGun with PyTest
FreezeGun is a library that helps with mocking out the
datetime.datetime.now function. It is a very useful tool for testing code that uses the
We can use the library with a decorator for the test or creating a
To demonstrate, add the following code to
The first test demonstrates the
with block will the second test demonstrates usage with a decorator.
pipenv run pytest will now run the tests and display the results.
Now we are ready to test our
is_date_before_today function in a manner similar to how our
main.py invokes the functions.
Let’s update our
tests/datetimes_test.py file to test the
In our test, we are freezing time (using the decorator) to the date of this blog post
2021-08-05 checking the following scenarios:
is_date_before_todaywhen compared to today should be
is_date_before_todaywhen compared to one day ago should be
is_date_before_todaywhen compared to one day ahead should be
We can confirm this to be true by once again running
pipenv run pytest:
Today’s post demonstrated how to use the FreezeGun package to mock the date for testing with PyTest.
Resources and further reading
Originally posted on my blog. To see new posts without delay, read the posts there and subscribe to my newsletter.