Как изменить аргументы pytest?
Я обнаружил, что для этой цели я могу использовать функцию PyTest pytest_load_initial_conftests ()
https://docs.pytest.org/en/latest/example/simple.html
Но я не могу правильно реализовать этот пример (см. Ссылку).
pytest_load_initial_conftests () даже не запускается (просматривал отладку). Тесты выполняются в обычном режиме без каких-либо параметров (один поток), но я ожидал "-n" параметр.
Я установил pytest и xdist. Всего два файла в проекте. Там нет pytest.ini.
Что я делаю неправильно? Пожалуйста, помогите запустить его.
conftest.py
import pytest
import os
import sys
def pytest_addoption(parser):
parser.addoption('--some_param', action='store', help='some_param', default='')
def pytest_configure(config):
some_param = config.getoption('--some_param')
def pytest_load_initial_conftests(args):
if "xdist" in sys.modules:
import multiprocessing
num = max(multiprocessing.cpu_count() / 2, 1)
args[:] = ["-n", str(num)] + args
test_t1.py
import inspect
from time import sleep
import os
import pytest
class Test_Run:
def test_1(self):
body()
def test_2(self):
body()
def test_3(self):
body()
def test_4(self):
body()
def setup(self):
pass
def teardown(self):
pass
def body():
sleep(5)
2 ответа
Согласно документам на pytest_load_initial_conftests
:
Примечание: эта ловушка не будет вызываться для файлов conftest.py, только для плагинов setuptools.
https://docs.pytest.org/en/latest/reference.html
Вероятно, это не должно быть упомянуто на той странице, которую вы нашли.
Добавьте дополнительный плагин, чтобы сделать аргументы pytest динамическими
Согласно документации API ,pytest_load_initial_conftests
хук не будет вызыватьсяconftest.py
файл, и его можно использовать только в плагинах.
Кроме того, в документации по pytest упоминается, как написать собственный плагин для pytest и сделать его устанавливаемым.
Следуя этому:
создать следующие файлы в корневом каталоге
- ./setup.py
- ./plugin.py
- ./tests/conftest.py
- ./pyproject.toml
# contents of ./setup.py
from setuptools import setup
setup(
name='my_project',
version='0.0.1',
entry_points={
'console_scripts': [
], # feel free to add if you have any
"pytest11": ["custom_args = plugin"]
},
classifiers=["Framework :: Pytest"],
)
уведомлениеpython11
здесь он зарезервирован для добавления плагинов pytest, как я читал.
# contents of ./plugin.py
import sys
def pytest_load_initial_conftests(args):
if "xdist" in sys.modules:
import multiprocessing
num = max(multiprocessing.cpu_count() / 2, 1)
args[:] = ["-n", str(num)] + args
# contents of ./tests/conftest.py
pytest_plugins = ["custom_args"] # allows to load plugin while running tests
# ... other fixtures and hooks
наконец, файл pyproject.toml для проекта
# contents of ./pyproject.toml
[tool.setuptools]
py-modules = []
[tool.setuptools]
py-modules = []
[build-system]
requires = [
"setuptools",
]
build-backend = "setuptools.build_meta"
[project]
name = "my_package"
description = "My package description"
readme = "README.md"
requires-python = ">=3.8"
classifiers = [
"Framework :: Flask",
"Programming Language :: Python :: 3",
]
dynamic = ["version"]
Это будет динамически добавлять-n
аргумент со значением, которое включает параллельную работу в зависимости от количества процессоров в вашей системе.
Надеюсь, это поможет, не стесняйтесь комментировать.