如果不满足条件,一开始就停止 pytest

Stop pytest right at the start if condition not met

如果某些条件不满足,任何阻止整个 pytest 运行 在早期阶段发生的方法。比如发现Elasticsearch服务不是运行ning?

我试过把它放在一个由所有测试文件导入的公共文件中:

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)

...但是正在对每个文件和每个文件中的每个测试进行 运行 测试,并且还会产生大量与错误相关的输出。

显然我想做的是在收集阶段的一开始就停止 运行。

显然,我也可以编写一个脚本,在使用我可能传递给它的任何 CLI 参数调用 pytest 之前检查任何必要的条件。这是实现此目标的唯一方法吗?

是的,MrBeanBremen 的解决方案也可以,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)

尝试使用 pytest_configure initialization hook.

在你的全局 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)

更新:

  1. 请注意 pytest_configure 的单个参数必须 命名为 config!
  2. 使用 pytest.exit 使它看起来更好。