Friday, November 15, 2019¶
Working with Hamza on #3340 (Atelier : testing should use tox instead of setup.py test). we started with the atelier package.
$ go atelier
$ pip install tox
$ tox-quickstart
...
What Python versions do you want to test against?
[1] py37
[2] py27, py37
[3] (All versions) py27, py35, py36, py37, pypy, jython
[4] Choose each one-by-one
> Enter the number of your choice [3]: 1
> Type the command to run your tests [pytest]:
What extra dependencies do your tests have?
default dependencies are: ['pytest']
> Comma-separated list of dependencies:
Finished: ./tox.ini has been created. For information on this file, see https://tox.readthedocs.io/en/latest/config.html
Execute `tox` to test your project.
So tox-quickstart suggests pytest as the default testing command. Okay, why not.
To avoid WARNING: Discarding $PYTHONPATH from environment, to override
specify PYTHONPATH in 'passenv' in your configuration.
I added the following to
the [testenv]
section:
setenv =
PYTHONPATH={toxinidir}
What should we say for envlist? py36? py37? or both? One should be enough. The tox default is 3.7 but that didn’t work for me because I had Python 3.6 on Ubuntu 18.04.3 LTS (Bionic Beaver). Which Python version is on Debian Buster? –> 3.7 So this is the Python we use on a normal production site, this should be our default version.
So I must just manually run:
sudo apt install python3.7
I also added a testpaths
because I know that we have all tests in that
subdirectory:
[pytest]
testpaths = tests
The default pytest behaviour is to discover files named test*.py
. So
I had to rename __init__.py
to test_everything.py
. The tests
directory no longer needs to be a package.
Now it works when I run:
$ tox
Except that it gives a warning:
DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
That’s for example in rstgen.sphinxconf.base
and lino.utils.dpy
.
I replaced them by importlib, let’s see whether that works. But other
dependencies (jinja2, ..) are using it, so the warning won’t go away. To
suppress them, I added the following to my [pytest]
section:
[pytest]
filterwarnings =
ignore::DeprecationWarning
I changed the inv test
command of atelier.invlib.tasks
to simply
run tox
.
Now what about coverage? Oho, pytest-cov promises “Subprocess support: you can fork or run stuff in a subprocess and will get covered without any fuss.”
- ::
$ pip install pytest-cov $ pytest –cov=atelier
So I just need to specify this as the commands
in my [testenv]
:
commands =
pytest --cov=atelier
And we can probably remove the inv cov
command because inv test
will always also run coverage.
Now of course we should review all our projects:
add a
tox.ini
filerename
__init__.py
totest_everything.py
Add
.tox
to the.gitignore
file.