Есть несколько способов справиться с этим, но я рассмотрю два общих подхода, которые я видел в базовых версиях Python.
1) Разделите свои тесты, поместив «дополнительные» тесты в другой каталог.
Не уверен, как выглядит макет вашего проекта, но вы можете сделать что-то вроде этого (важен только тестовый каталог, остальное - просто пример макета игрушки):
README.md
setup.py
requirements.txt
test/
unit/
test_something.py
test_something_else.py
integration/
test_optional.py
application/
__init__.py
some_module.py
Затем, когда вы вызываете pytest, вы вызываете его, выполняя pytest test/unit
, если вы хотите запустить просто модульных тестов (т.е. только test_something*.py
файлы), или pytest test/integration
, если вы хотите запустите просто интеграционные тесты (т.е. только test_optional.py
) или pytest test
, если вы хотите запустить все тесты. Таким образом, по умолчанию вы можете просто запустить pytest unit/test
.
Я рекомендую обернуть эти вызовы в какой-нибудь скрипт. Я предпочитаю make
, так как он мощный для этого типа упаковки. Затем вы можете сказать make test
, и он просто запустит ваш стандартный (быстрый) набор тестов, или make test_all
, и он запустит все тесты (которые могут быть медленными или нет).
Пример Makefile, который вы можете обернуть:
.PHONY: all clean install test test_int test_all uninstall
all: install
clean:
rm -rf build
rm -rf dist
rm -rf *.egg-info
install:
python setup.py install
test: install
pytest -v -s test/unit
test_int: install
pytest -v -s test/integration
test_all: install
pytest -v -s test
uninstall:
pip uninstall app_name
2) Разумно пометьте свои тесты с помощью декоратора @pytest.mark.skipif
, но используйте переменную окружения в качестве триггера
Мне не очень нравится это решение, оно кажется мне бессистемным (трудно сказать, какой набор тестов выполняется при любом прогоне pytest
). Однако вы можете определить переменную среды, а затем привязать эту переменную среды к модулю, чтобы определить, хотите ли вы выполнить все свои тесты. Переменные среды зависят от оболочки, но я буду притворяться, что у вас есть среда bash, поскольку это популярная оболочка.
Вы можете сделать export TEST_LEVEL="unit"
только для быстрых юнит-тестов (так это будет по умолчанию) или export TEST_LEVEL="all"
для всех ваших тестов. Затем в своих тестовых файлах вы можете делать то, что изначально пытались сделать, так:
import os
...
@pytest.mark.skipif(os.environ["TEST_LEVEL"] == "unit")
def test_scrape_website():
...
Примечание: Называть тестовые уровни "единица" и "интеграция" не имеет значения. Вы можете назвать их как хотите. Вы также можете иметь много уровней (например, ночные тесты или тесты производительности).
Кроме того, я думаю, что вариант 1 - лучший путь, поскольку он не только четко позволяет разделить тестирование, но также может добавить семантику и ясность к тому, что тесты означают и представляют. Но в программном обеспечении не существует «одного размера для всех», вам придется решать, какой подход вам больше подходит, исходя из ваших конкретных обстоятельств.
НТН!