有两种方法可以解决此问题,但我将介绍在Python基准中见过的两种常见方法。
1)通过将“可选”测试放在另一个目录中来分离测试。
不确定项目的布局是什么样,但是您可以执行以下操作(仅测试目录很重要,其余只是一个玩具示例布局):
README.mdsetup.pyrequirements.txttest/ unit/ test_something.py test_something_else.py integration/ test_optional.pyapplication/ __init__.py some_module.py
然后,当你调用pytest,你调用它这样做
pytest test/unit,如果你想运行 只是
单元测试(即只
test_something*.py文件),或者
pytest test/integration如果你想运行 只是
集成测试(即只
test_optional.py),或者
pytest test如果你想运行 的所有
的测试。因此,默认情况下,您可以运行
pytest test/unit。
我建议将这些调用包装在某种脚本中。我更喜欢,
make因为它对于这种类型的包装功能强大。然后,您可以说
maketest它只运行您的默认(快速)测试套件或
make test_all,它将运行所有测试(可能很慢,也可能不会很慢)。
您可以使用以下示例Makefile进行包装:
.PHONY: all clean install test test_int test_all uninstallall: installclean: rm -rf build rm -rf dist rm -rf *.egg-infoinstall: python setup.py installtest: install pytest -v -s test/unittest_int: install pytest -v -s test/integrationtest_all: install pytest -v -s testuninstall: pip uninstall app_name
2)使用@pytest.mark.skipif
装饰器明智地标记测试,但使用环境变量作为触发器
我不太喜欢这种解决方案,这让我感到有些无所适从(很难确定在任何一次给定
pytest运行中正在运行哪组测试)。但是,您可以做的是定义一个环境变量,然后将该环境变量连接到模块中以检测是否要运行所有测试。环境变量取决于shell,但是我假装您有一个bash环境,因为它是流行的shell。
您可以
export TEST_LEVEL="unit"只进行快速的单元测试(因此这是默认设置),也可以
exportTEST_LEVEL="all"进行所有测试。然后,在测试文件中,您可以执行以下操作:
import os...@pytest.mark.skipif(os.environ["TEST_LEVEL"] == "unit")def test_scrape_website(): ...
注意: 将测试级别命名为“单位”和“集成”无关。您可以随意命名。您也可以具有许多级别(例如每晚测试或性能测试)。
另外,我认为选项1是最好的选择,因为它不仅清楚地允许测试的分离,而且还可以为测试的含义和表示增加语义和清晰度。但是软件中没有“一刀切”的解决方案,您必须根据自己的具体情况来决定采用哪种方法。
HTH!



