Как изменить аргументы 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аргумент со значением, которое включает параллельную работу в зависимости от количества процессоров в вашей системе.

Надеюсь, это поможет, не стесняйтесь комментировать.

Другие вопросы по тегам