Я использую pytest. У меня есть два файла в каталоге. В одном из файлов есть длинный тестовый сценарий, который генерирует некоторый вывод. В другом файле есть тестовый пример, который считывает этот вывод. Как я могу обеспечить правильный порядок выполнения двух тестовых случаев? Есть ли другая альтернатива, кроме того, что тестовые примеры находятся в одном файле в правильном порядке?
Порядок выполнения тестового примера в pytest
Ответ 1
В общем, вы можете настроить поведение практически любой части pytest, используя четко определенные хуки.
В вашем случае вам нужен хук "pytest_collection_modifyitems", который позволяет переупорядочивать собранные тесты на месте.
Тем не менее, кажется, что заказывать ваши тесты должно быть проще - в конце концов, это Python! Поэтому я написал плагин для упорядочивания тестов: "pytest-ordering". Проверьте документы или установите его с pypi. Прямо сейчас я рекомендую использовать @pytest.mark.first и @pytest.mark.second или один из маркеров @pytest.mark.order #, но у меня есть некоторые идеи по поводу более полезных API. Предложения приветствуются :)
Ответ 2
Похоже, Pytest запускает тесты в алфавитном порядке. Таким образом, вы можете попробовать так:
def test_a_first_test():
pass
def test_b_second_test():
pass
def test_o_middle_test():
pass
Ответ 3
Есть также плагин pytest-ordering, который, кажется, соответствует вашим требованиям.
Ответ 4
Возможно, вы можете использовать плагин для зависимостей pytest, где вы можете легко установить тестовые зависимости:
@pytest.mark.dependency()
def test_long():
pass
@pytest.mark.dependency(depends=['test_long'])
def test_short():
pass
Таким образом, test_short
будет выполняться только в случае успеха test_long
и принудительно выполнять последовательность выполнения.
Ответ 5
Попробуйте это:
@pytest.fixture(xxx)
def test_A():
pass
yield
pass
@pytest.mark.usefixtures('test_A')
def test_B():
pass
Ответ 6
main.py:
import functools
import pytest
from demo import test_foo,test_hi
def check_depends(depends):
try:
for dep in depends:
dep()
except Exception as e:
return dep
else:
return True
def pytest_depend(depends):
def pytest_depend_decorator(func):
stat = check_depends(depends)
if stat is True:
return func
else:
return pytest.mark.skip(True, reason="%s[skip] --> %s[Failed]" % (func.__name__, stat.__name__))(func)
return pytest_depend_decorator
@pytest_depend([test_foo,test_hi])
def test_bar():
pass
@pytest_depend([test_foo,test_hi])
def test_bar2():
pass
demo.py:
def test_hi():
pass
def test_foo():
assert False
платформа Linux - Python 3.5.2, pytest-3.8.2, py-1.6.0, pluggy-0.7.1 -/usr/bin/python3
pytest -vrsx./plugin.py
Ответ 7
Убедитесь, что у вас установлен пакет для заказа pytest. Для подтверждения перейдите в настройки Pycharm >> Project Interpreter >> и найдите pytest-ordering: Если он недоступен, установите его. Настройки Pycharm >> Project Interpreter >> Нажмите на кнопку + и выполните поиск Pytest-ordering, установите его. Вуаля !! Это определенно будет работать.
Ответ 8
Используйте опцию '- random-dont-reorganize' или '-p no: randomly', доступную в плагине pytest-randomly, это будет просто запустите тест в том же порядке, который вы упомянули в своем модуле.
Модуль:
import pytest
def test_three():
assert True
def test_four():
assert True
def test_two():
assert True
def test_one():
assert True
Исполнение:
(tmp.w95BqE188N) [email protected]:~/$ py.test --randomly-dont-reorganize test_dumm.py
======================================================================== test session starts ========================================================================
platform linux2 -- Python 2.7.12, pytest-3.10.1, py-1.5.4, pluggy-0.7.1 -- /tmp/tmp.w95BqE188N/bin/python2
cachedir: .pytest_cache
Using --randomly-seed=1566829391
rootdir: /home/rkalaiselvan, inifile: pytest.ini
plugins: randomly-1.2.3, timeout-1.3.1, cov-2.6.0, mock-1.10.0, ordering-0.6
collected 4 items
test_dumm.py::test_three PASSED
test_dumm.py::test_four PASSED
test_dumm.py::test_two PASSED
test_dumm.py::test_one PASSED
(tmp.w95BqE188N) [email protected]:~/$ py.test -p no:randomly test_dumm.py
======================================================================== test session starts ========================================================================
platform linux2 -- Python 2.7.12, pytest-3.10.1, py-1.5.4, pluggy-0.7.1 -- /tmp/tmp.w95BqE188N/bin/python2
cachedir: .pytest_cache
Using --randomly-seed=1566829391
rootdir: /home/rkalaiselvan, inifile: pytest.ini
plugins: randomly-1.2.3, timeout-1.3.1, cov-2.6.0, mock-1.10.0, ordering-0.6
collected 4 items
test_dumm.py::test_three PASSED
test_dumm.py::test_four PASSED
test_dumm.py::test_two PASSED
test_dumm.py::test_one PASSED