有两种方法可以处理这个问题,但我将回顾一下在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文件),您可以通过执行pytest test/unit来调用它;如果您想运行集成测试(即只运行test_optional.py),则执行pytest test,如果您想运行所有测试,则执行pytest test。所以,默认情况下,您可以运行pytest test/unit。在
我建议用某种脚本包装这些调用。我更喜欢make,因为它对于这种类型的包装非常强大。然后你可以说make test,它只运行默认的(快速)测试套件,或者make test_all,它将运行所有测试(可能慢也可能不慢)。在
可以包装的示例Makefile:
^{pr2}$
2)使用@pytest.mark.skipif修饰符明智地标记测试,但使用环境变量作为触发器
我不太喜欢这个解决方案,我觉得有点随意(很难判断在任何给定的运行中运行的是哪一组测试)。但是,您可以定义一个环境变量,然后将该环境变量绑定到模块中,以检测是否要运行所有测试。环境变量依赖于shell,但是我假设您有一个bash环境,因为这是一个流行的shell。在
您可以对快速单元测试执行export TEST_LEVEL="unit"(因此这是您的默认设置),或者对所有测试执行export TEST_LEVEL="all"。然后,在测试文件中,您可以按如下方式执行最初尝试的操作:import os
...
@pytest.mark.skipif(os.environ["TEST_LEVEL"] == "unit")
def test_scrape_website():
...
注意:将测试级别命名为“unit”和“integration”无关紧要。你想叫什么名字都行。您还可以有许多级别(比如夜间测试或性能测试)。在
另外,我认为选项1是最好的方法,因为它不仅清楚地允许分离测试,而且还可以为测试的含义和表示的内容增加语义和清晰度。但是软件中并没有“一刀切”的地方,你必须根据自己的具体情况来决定你喜欢什么样的方法。在
啊!在