如何将 Python 单元测试指定为具有数据库依赖性?

How to designate Python unit tests as having database dependency?

我正在开发一个项目,其中有许多 "unit tests" 具有需要与数据库和其他 API 交互的硬依赖项。这些测试对我们的团队来说是宝贵且有用的资源,但它们不能 运行 独立,而不依赖于测试环境中其他服务的功能。我个人会称之为 "functional tests",但这只是我们团队中已经建立的语义。

问题是,既然我们开始在我们的代码中引入更多的纯单元测试,我们就会有一堆有或没有外部依赖性的测试。这些测试可以 运行 在签出代码后立即进行,无需安装或配置其他工具。他们也可以在像jenkins这样的持续集成环境中运行

所以我的问题是,如何表示哪个是更清晰的分离?单元测试库中是否存在装饰器?

您可以使用 skipIf 装饰器定义应该跳过哪个测试。结合设置环境变量,您可以跳过某些环境中的测试。一个例子:

from unittest import skipIf

class MyTest(Testcase):

    @skipIf(os.environ.get('RUNON') == 'jenkins', 'Does not run in Jenkins')
    def test_my_code(self):
        ...

这是另一种选择。您可以按目录分隔不同的测试类别。如果你想尝试这个策略,它可能看起来像:

python -modules unit -pure unit test modules functional -other unit test modules

在您的测试管道中,您可以调用您的测试框架来仅执行所需的测试。例如,对于 Python 的 unittest,您可以从 python 目录 中 运行 您的 'pure unit tests'

python -m unittest discover --start-directory ../unit

和 functional/other 单元测试

python -m unittest discover --start-directory ../functional

此设置的一个优点是您的测试很容易分类,并且您可以在每个测试环境中执行您需要的任何脚手架或模拟服务。有更多 Python 经验的人也可以帮助您 运行 测试,而不管当前目录如何。