Stop pytest right at the start if condition not met

2.4k Views Asked by At

Any way of stopping the entire pytest run from happening at a very early stage if some condition is not met. For example, if it is found that the Elasticsearch service is not running?

I have tried putting this in a common file which is imported by all test files:

try:
    requests.get('http://localhost:9200')
except requests.exceptions.ConnectionError:
    msg = 'FATAL. Connection refused: ES does not appear to be installed as a service (localhost port 9200)' 
    pytest.exit(msg)

... but tests are being run for each file and each test within each file, and large amounts of error-related output is also produced.

Obviously what I am trying to do is stop the run at the very start of the collection stage.

Obviously too, I could write a script which checks any necessary conditions before calling pytest with any CLI parameters I might pass to it. Is this the only way to accomplish this?

2

There are 2 best solutions below

0
Roland Smith On BEST ANSWER

Try using the pytest_configure initialization hook.

In your global conftest.py:

import requests
import pytest

def pytest_configure(config):
    try:
        requests.get(f'http://localhost:9200')
    except requests.exceptions.ConnectionError:
        msg = 'FATAL. Connection refused: ES does not appear to be installed as a service (localhost port 9200)' 
        pytest.exit(msg)

Updates:

  1. Note that the single argument of pytest_configure has to be named config!
  2. Using pytest.exit makes it look nicer.
3
mike rodent On

Yes, MrBeanBremen's solution also works, with the following code in conftest.py:

@pytest.fixture(scope='session', autouse=True)    
def check_es():
    try:
        requests.get(f'http://localhost:9200')
    except requests.exceptions.ConnectionError:
        msg = 'FATAL. Connection refused: ES does not appear to be installed as a service (localhost port 9200)' 
        pytest.exit(msg)