Testing¶
Testing should be required for all source code. While there are many
tools available for testing python code pytest
in my option is the
clear winner. I beleive this is due to pytest
being the most
pythonic framework for testing. PyTest gives a guide on integrating
it into your project. The
following will give a setup that is both simple and
opinionated. Another easy win we can get with pytest is code
coverage. We will use the add-on package pytest-cov
for this.
setup.py¶
setup(
...
setup_requires=['pytest-runner', ...],
tests_require=['pytest', 'pytest-cov'],
)
setup.cfg¶
[aliases]
test=pytest
That is all you need to get pytest
running! You can run all tests
via the command python setup.py test
or py.test
. Now that is
all assuming you have tests. pytest
by default will look for tests
in the tests
directory and runs all files with the name
test_<filename>.py
. In order to get the additional coverage report
with the tests you need to add some additional arguments python
setup.py test --addopts "--cov=pypkgtemp"
. Read the pytest
documentation for more detailed
documentation . For example create a file tests/test_example.py
with the following code.
test/test_example.py¶
def test_example():
assert 1 == 1
Now run the test via python setup.py test
and you should see that
one test passes. Similarly how we discussed that all new tags of our
project should be pushed to PyPi we should also test all commits when
they are pushed to gitlab. Adding to the .gitlab-ci.yml
setup in
the :doc:`pypi`_ documentation.
.gitlab-ci.yml¶
stages:
- test
- deploy
test:
image: python:3.6
stage: test
script:
- pip install .
- pip list
- python setup.py test --addopts "--cov=<package-directory>"
With these changes it will test every commit given to Gitlab and will
only submit a new package if all tests pass! All of this has been
automated for us. In order to get the coverage report setup correctly
you will need to tell gitlab the regular expression to use in order to
parse the coverage report. For pytest-cov
this is
^TOTAL\s+\d+\s+\d+\s+(\d+)\%\s*$
.