When comparing unittest vs pytest, the Slant community recommends pytest for most people. In the question“What are the best Python unit testing frameworks?” pytest is ranked 1st while unittest is ranked 3rd. The most important reason people chose pytest is:
The idioms that pytest first introduced brought a change in the Python community because they made it possible for test suites to be written in a very compact style, or at least far more compact than was ever possible before. Pytest basically introduced the concept that Python tests should be plain Python functions instead of forcing developers to include their tests inside large test classes.
Ranked in these QuestionsQuestion Ranking
Pro Part of the Python standard library
PyUnit has been a part of the Python standard library since version 2.1 as the unittest module. This makes it widely available to developers without the need to install additional modules since it's coming out of the box with Python.
Pro Flexible test case execution
The way tests are run is through:
if name == 'main':
unittest.main() builds a
TestSuite object that contains all the tests that have method names starting with "test", then a
TextTestRunnerwhich then executes each method and prints the results.
But individual test cases can be executed simply by specifying their names on the terminal:
python unittest_program.py testProgram.testGetFeedPostingHost
The default output is usually pretty concise, but it can be more verbose simply by adding a
-v flag in the end when calling the test from the command line.
So unittest can be considered pretty flexible when it comes to test case execution.
Pro Promotes grouping related tests into common test suites
Pro Very fast test collection
Pro Easy to use for people who are comfortable with testing in other languages
Since pyUnit is a derivative of xUnit and it's quite similar to other xUnit frameworks, it's quite easy for people with not much Python background to relate to.
Pro Very precise test duration reports
Unittest reports tests duration in milliseconds
Pro Allows for compact test suites
The idioms that pytest first introduced brought a change in the Python community because they made it possible for test suites to be written in a very compact style, or at least far more compact than was ever possible before.
Pytest basically introduced the concept that Python tests should be plain Python functions instead of forcing developers to include their tests inside large test classes.
Pro Very pretty and useful failure information
With most other tools you have to use debugger or extra logging to find out where did some value came from in your test. Not with pytest!
Pytest rewrites your test so that it can store all intermediate values that can lead to failing assert and provides you with very pretty explanation about what has been asserted and what have failed.
Pro Minimal boilerplate
Tests written with pytest need very little boilerplate code, which makes them easy to write and understand.
Pro Fixtures are simple and easy to use
A fixture is just a function that returns a value and to use a fixture you just have to add an argument to your test function. You can also use a fixture from another fixture in the same manner, so it's easy to make them modular.
You can also parametrize fixture and every test that uses it will run with all values of parameters, no test rewrite needed. If your test uses several fixtures, all parameters' combinations will be covered.
Pro Tests parametrization
You can parametrize any test and cover all uses of a unit without code duplication.
Pro Extensible (many of plugins are available)
Pytest can easily be extended with several hooks, and the same team develops a number of very useful plugins. For example, you install pytest-xdist, and parallel test execution just works, with all the same benefits you had with pytest (as opposed to having to use a separate test runner, for example)
Pro Pdb just works
Pytest automagically (and safely) disables output capturing when you're entering pdb, so you don't have to redirect debugger to other console or bear huge amount of unneeded output from other tests.
Pro Provides special routines to make testing easier
Pytest provides developers with special routines to make test writing easier. This makes writing tests less error-prone and all around simple. It also results in shorter and more readable code.
Pro Test discovery by file-path
Con camelCase naming
Idiomatic python code uses snake_case, but this was ported so closely from JUnit that it has retained java-style camelCase method names. That can be jarring.
Con No color output
Con The API can make the test code's intent hard to understand
Although unittest does not have a huge API that needs to be remembered, it has too much support for abstraction, this makes the test code intent's unclear.
Too much boilerplate code is needed.
Con Compatibility issues with other testing frameworks
The fact that pytest uses it's own special routines to write tests means that you are trading convenience for compatibility. In other words, writing tests for pytest means that you are tying yourself to only pytest and the only way to use another testing framework is to rewrite most of the code.