Hi đź‘‹
In this short article I want to explain the use of the yield keyword in pytest fixtures.
What is pytest?
Pytest is a complex python framework used for writing tests. It has lots of advanced features and it supports plugins. Many projects prefer pytest in addition to Python’s unitttest library.
What is a fixture?
A test fixture is a piece of code that fixes some common functionality that is required for writing the unit tests. This functionality can be
- a connection to the database
- a testing http server or client
- creation of a complex object
You can read more about test fixtures on Wikipedia.
What does yield keyword do?
In Python, the yield keyword is used for writing generator functions, in pytest, the yield can be used to finalize (clean-up) after the fixture code is executed. Pytest’s documentation states the following.
“Yield” fixtures
yield
instead ofreturn
. With these fixtures, we can run some code and pass an object back to the requesting fixture/test, just like with the other fixtures.
https://docs.pytest.org/en/6.2.x/fixture.html
An example code could be the following:
|
|
Running a sample test which utilizes the fixture will output:
|
|
Running the same test but now with the fixture my_object_fixture2, will output:
|
|
I hope I could successfully ilustrate with these examples the order in which the testing and fixture code is run.
To run the tests, I’ve used pytest --capture=tee-sys .
in the project root. The file contents are attached to the end of this article. The --capture
parameter is used to capture and print the tests stdout. Pytest will only output stdout of failed tests and since our example test always passes this parameter was required.
Conclusion
Pytest is a python testing framework that contains lots of features and scales well with large projects.
Test fixtures is a piece of code for fixing the test environment, for example a database connection or an object that requires a specific set of parameters when built. Instead of duplicating code, fixing the object’s creation into a fixture makes the tests easier to maintain and write.
yield is a python keyword and when it is used in conjunction with pytest fixtures it gives you a nice pythonic way of cleaning up the fixtures.
Thanks for reading! đź“š
Contents of the Pytest fixtures placed in tests/__init__.py
|
|
Contents of my_object.py
|
|
Contents of test_my_object.py placed in tests/test_my_object.py
|
|