We should write the test cases to test our software. These tests ensures no regression in existing functionality while adding new changes to the code.
pytest
pytest is a framework that makes building simple and scalable tests easy. Tests are expressive and readable—no boilerplate code required. pytest test cases are a series of functions in a Python file starting with the name test_.
Install
Run the following command in your command line:
pip install -U pytestCreate test
In order to understand the complete picture, before creating a test, let’s create a sample functionality to test.
Here we will implement a functionality which will multiply given two numbers. Create a new project folder and, inside that, create a new folder called my_multi. Inside my_multi, create an empty file called __init__.py. Creating the __init__.py file means that the my_multi folder can be imported as a module from the parent directory.
project/
│
└── my_multi/
└── __init__.py
multi.py# content of multi.py
def multiply(a, b):
return a * bYou can add your test directly under project folder or under sub-folder. I added it under tests. The test file name should either start or end with test. So that test runner will assume that the python file contains tests to be executed. Similarly the test case should also start with test_
project/
│
├── my_multi/
│ └── __init__.py
| multi.py
|
└── tests/
└── __init__.py
test_multi.py# content of test_multi.py
import pytest
from my_multi import multiply
def test_multiplication():
assert (multiply(2, 3) == 6)Run test
You can invoke testing through the Python interpreter from the command line
python -m pytest tests/
Or simply
pytest tests/pytest dumps pass or fail results
============================= test session starts =============================
platform win32 -- Python 3.6.5, pytest-3.5.1, py-1.5.3, pluggy-0.6.0
rootdir: project, inifile:
plugins: remotedata-0.2.1, openfiles-0.3.0, doctestplus-0.1.3, arraydiff-0.2
collected 1 items
tests\test_multi.py ... [100%]
========================== 1 passed in 0.02 seconds ===========================I purposefully changed the multiply function to divide a by b. So now our test failed showing the call stack.
============================= test session starts =============================
platform win32 -- Python 3.6.5, pytest-3.5.1, py-1.5.3, pluggy-0.6.0
rootdir: project, inifile:
plugins: remotedata-0.2.1, openfiles-0.3.0, doctestplus-0.1.3, arraydiff-0.2
collected 1 items
tests\test_multi.py F.. [100%]
================================== FAILURES ===================================
_____________________________ test_multiplication _____________________________
def test_multiplication():
> assert (multiply(2, 3) == 6)
E assert 0 == 6
E + where 0 = multiply(2, 3)
tests\test_multi.py:14: AssertionError
===================== 1 failed in 0.02 seconds ======================Other options to run tests
You can use -v for verbose result, like status of each test ran.
pytest -v /path/to/test_file.pyIf you have mulptiple tests in a file and only wants to run specific test out them, you can do as below.
pytest -v /path/to/test_file.py::test_name