Recall
In this chapter, we’ve looked at a number of topics related to testing applications written in Python. These topics include the following:
-
We described the importance of unit testing and test-driven development as a way to be sure our software does what is expected.
-
We started by using the
unittest
module because it’s part of the standard library and readily available. It seems a little wordy, but otherwise works well for confirming that our software works. -
The
pytest
tool requires a separate installation, but it seems to produce tests that are slightly simpler than those written with theunittest
module. More importantly, the sophistication of the fixture concept lets us create tests for a wide variety of scenarios. -
The
mock
module, part of theunittest
package, lets us create mock objects to better isolate the unit of code being tested. By isolating each piece of code, we can narrow our focus on being sure it works and has the right interface. This makes it easier to combine components. -
Code coverage is a helpful metric to ensure that our testing is adequate. Simply adhering to a numeric goal is no substitute for thinking, but it can help to confirm that efforts were made to be thorough and careful when creating test scenarios.
We’ve been looking at several kinds of tests with a variety of tools:
-
Unit tests with the
unittest
package or thepytest
package, often usingMock
objects to isolate the fixture or unit being tested. -
Integration tests, also with
unittest
andpytest
, where more complete integrated collections of components are tested. -
Static analysis can use mypy to examine the data types to be sure they’re used properly. This is a kind of test to ensure the software is acceptable. There are other kinds of static tests, and tools like
flake8
,pylint
, andpyflakes
can be used for these additional analyses.
Some research will turn up scores of additional types of tests. Each distinct type of test has a distinct objective or approach to confirming the software works. A performance test, for example, seeks to establish the software is fast enough and uses an acceptable number of resources. We can’t emphasize enough how important testing is. Without automated tests, software can’t be considered complete or even usable. Starting from test cases lets us define the expected behavior in a way that’s specific, measurable, achievable, results-based, and trackable: SMART.
Synopsis
We have finally covered the most important topic in Python programming: automated testing. Test-driven development is considered a best practice. The standard library unittest
module provides a great out-of-the-box solution for testing, while the pytest
framework has some more Pythonic syntaxes. Mocks can be used to emulate complex classes in our tests. Code coverage gives us an estimate of how much of our code is being run by our tests, but it does not tell us that we have tested the right things.
Get hands-on with 1400+ tech skills courses.