Where Do The Python Unit Tests Go?
Solution 1:
For a file module.py
, the unit test should normally be called test_module.py
, following Pythonic naming conventions.
There are several commonly accepted places to put test_module.py
:
- In the same directory as
module.py
. - In
../tests/test_module.py
(at the same level as the code directory). - In
tests/test_module.py
(one level under the code directory).
I prefer #1 for its simplicity of finding the tests and importing them. Whatever build system you're using can easily be configured to run files starting with test_
. Actually, the default unittest
pattern used for test discovery is test*.py
.
Solution 2:
Only 1 test file
If there has only 1 test files, putting it in a top-level directory is recommended:
module/
lib/
__init__.py
module.py
test.py
Run the test in CLI
python test.py
Many test files
If has many test files, put it in a tests
folder:
module/
lib/
__init__.py
module.py
tests/
test_module.py
test_module_function.py
# test_module.pyimport unittest
from lib import module
classTestModule(unittest.TestCase):
deftest_module(self):
passif __name__ == '__main__':
unittest.main()
Run the test in CLI
# In top-level /module/ folder
python -m tests.test_module
python -m tests.test_module_function
Use unittest discovery
unittest discovery
will find all test in package folder.
Create a __init__.py
in tests/
folder
module/
lib/
__init__.py
module.py
tests/
__init__.py
test_module.py
test_module_function.py
Run the test in CLI
# In top-level /module/ folder# -s, --start-directory (default current directory)# -p, --pattern (default test*.py)
python -m unittest discover
Reference
pytest
Good Practices for test layoutunittest
Unit test framework
Solution 3:
A common practice is to put the tests directory in the same parent directory as your module/package. So if your module was called foo.py your directory layout would look like:
parent_dir/
foo.py
tests/
Of course there is no one way of doing it. You could also make a tests subdirectory and import the module using absolute import.
Wherever you put your tests, I would recommend you use nose to run them. Nose searches through your directories for tests. This way, you can put tests wherever they make the most sense organizationally.
Solution 4:
We had the very same question when writing Pythoscope (https://pypi.org/project/pythoscope/), which generates unit tests for Python programs. We polled people on the testing in python list before we chose a directory, there were many different opinions. In the end we chose to put a "tests" directory in the same directory as the source code. In that directory we generate a test file for each module in the parent directory.
Solution 5:
I also tend to put my unit tests in the file itself, as Jeremy Cantrell above notes, although I tend to not put the test function in the main body, but rather put everything in an
if__name__== '__main__':
do tests...
block. This ends up adding documentation to the file as 'example code' for how to use the python file you are testing.
I should add, I tend to write very tight modules/classes. If your modules require very large numbers of tests, you can put them in another, but even then, I'd still add:
if__name__== '__main__':
import tests.thisModule
tests.thisModule.runtests
This lets anybody reading your source code know where to look for the test code.
Post a Comment for "Where Do The Python Unit Tests Go?"