0

In the default behaviour giving the command python setup.py test will execute the unit tests associated with a module. This default behaviour can be made to work simply by providing a list of test-suite modules.

The alternative (but now obsolete) Nose test runner has a comparable feature - you can just provide the string nose.collector which gives the test command the ability to auto-discover the tests associated with the project.

But what if I'm using pytest? There doesn't seem to be a documented pattern to run tests from the setup.py file. Is this a behaviour supported by the pytest library?

Salim Fadhley
  • 6,975
  • 14
  • 46
  • 83
  • 1
    Did you read the docs? https://docs.pytest.org/en/latest/goodpractices.html#integrating-with-setuptools-python-setup-py-test-pytest-runner – jonrsharpe May 11 '17 at 17:12

1 Answers1

3

I personally have not done this. But I'd recommend checking out some legit python projects on github to see how they have done this. E.g. requests:

#!/usr/bin/env python

import sys

from setuptools import setup
from setuptools.command.test import test as TestCommand


class PyTest(TestCommand):
    user_options = [('pytest-args=', 'a', "Arguments to pass into py.test")]

    def initialize_options(self):
        TestCommand.initialize_options(self)
        self.pytest_args = []

    def finalize_options(self):
        TestCommand.finalize_options(self)
        self.test_args = []
        self.test_suite = True

    def run_tests(self):
        import pytest

        errno = pytest.main(self.pytest_args)
        sys.exit(errno)

setup(
    # pass all the required/desired args
    cmdclass={'test': PyTest}
)

You can even pass args to pytest runner python setup.py test --pytest-args='-vvv'

Also checkout the docs: https://docs.pytest.org/en/latest/goodpractices.html#integrating-with-setuptools-python-setup-py-test-pytest-runner (thanks to @jonrsharpe for the link)

Dmitry Tokarev
  • 1,851
  • 15
  • 29