如何在 pytest 中将单元测试和集成测试分开

How to keep Unit tests and Integrations tests separate in pytest

根据 Wikipedia and various articles,最佳做法是将测试分为单元测试(运行 首先)和集成测试(运行 第二),其中单元测试通常非常快并且在 CI 环境中的每个构建都应该 运行,但是集成测试需要更长的时间才能 运行,而且应该更像是每天 运行。

有没有办法在pytest中划分这些?大多数项目似乎没有多个测试文件夹,所以有没有办法根据情况确保我只有 运行 单元、集成或两者(CI vs 每日构建)?在计算测试覆盖率时,我假设我必须 运行 两者。

我尝试将测试划分为这些类别的方法是否正确?是否有某个项目的一个很好的例子已经做到了这一点?

是的,您可以使用 pytest.mark 装饰器标记测试。

示例:

def unit_test_1():
    # assert here

def unit_test_2():
    # assert here

@pytest.mark.integtest
def integration_test():
    # assert here

现在,从命令行,您可以 运行 pytest -m "not integtest" 仅用于单元测试,pytest -m integtest 仅用于集成测试,普通 pytest 用于所有测试。

(如果你愿意,你也可以用 pytest.mark.unit 装饰你的单元测试,但我觉得有点 tedious/verbose)

有关详细信息,请参阅 documentation

您还可以在结构上将 单元和集成测试分离到特定目录中。这是来自 A. Shaw 的 article Getting Started With Testing Python:

中的示例文件结构

通过结构化方法,您:

  1. 不需要手动标记各种带有属性的测试或@pytest.mark
  2. 不限于特定测试运行ner。请参阅下面的示例。

例子

这里我们 运行 各种测试 运行 人员单独进行集成测试。请参见上图中的示例 project/ 目录。

使用标准库中的 unittest

λ python -m unittest discover -s tests/integration

nose:

λ nose tests/integration

pytest:

λ pytest tests/integration

许多测试 运行ners 有一个自动测试发现机制,可以在子目录中找到测试。这提供了 运行 所有测试的选择,例如

λ cd <root_dir>
λ pytest project/