Nemo
Nemo

Reputation: 461

Perform sanity check before running tests with pytest

I would like to perform some sanity check when I run tests using pytest. Typically, I want to check that some executables are accessible to the tests, and that the options provided by the user on the command-line are valid.

The closest thing I found was to use a fixture such as:

@pytest.fixture(scope="session", autouse=True)
def sanity_check(request):
  if not good:
     sys.exit(0)

But this still runs all the tests. I'd like for the script to fail before attempting to run the tests.

Upvotes: 2

Views: 2484

Answers (2)

hoefling
hoefling

Reputation: 66261

You shouldn't need to validate the command line options explicitly; this will be done by the arg parser which will abort the execution early if necessary. As for conditions checking, you are not far from the solution. Use

  • pytest.exit to to an immediate abort
  • pytest.skip to skip all tests
  • pytest.xfail to fail all tests (this is an expected failure though, so it won't mark the whole execution as failed)

Example fixture:

@pytest.fixture(scope='session', autouse=True)
def precondition():
    if not shutil.which('spam'):
        # immediate shutdown
        pytest.exit('Install spam before running this test suite.')
        # or skip each test
        # pytest.skip('Install spam before running this test suite.')
        # or make it an expected failure
        # pytest.xfail('Install spam before running this test suite.')

xdist compatibility

Invoking pytest.exit() in the test run with xdist will only crash the current worker and will not abort the main process. You have to move the check to a hook that is invoked before the runtestloop starts (so anything before the pytest_runtestloop hook), for example:

# conftest.py
def pytest_sessionstart(session):
    if not shutil.which('spam'):
        # immediate shutdown
        pytest.exit('Install spam before running this test suite.')

Upvotes: 4

Robert
Robert

Reputation: 171

If you want to run sanity check before whole test scenario then you can use conftest.py file - https://docs.pytest.org/en/2.7.3/plugins.html?highlight=re

Just add your function with the same scope and autouse option to conftest.py:

@pytest.fixture(scope="session", autouse=True)
def sanity_check(request):
  if not good:
     pytest.exit("Error message here")

Upvotes: 1

Related Questions