pytest 不承认基类中的 PASSED 依赖项导致派生类中的 SKIPPED 测试

Posted

技术标签:

【中文标题】pytest 不承认基类中的 PASSED 依赖项导致派生类中的 SKIPPED 测试【英文标题】:pytest not acknowledging PASSED dependency in base class results in SKIPPED tests in derived class 【发布时间】:2021-01-27 17:35:15 【问题描述】:

我有一个小项目,我使用 pytestpytest-dependencytox 来开发一些代码的集成测试。到目前为止,我使用了一个基类 (BTestClass),并在根目录中进行了一些常见测试,并在其旁边的 test_Component.py file 中对每个代码组件进行了特定测试,实现了从 BTestClass 继承的 TestC 类。

在那之前一切都很好。现在我想为另一组组件添加一个BTestClass2。所以我添加了另一层继承,但现在它不起作用,pytest 验证常见的A 测试但随后跳过依赖它的测试。我不知道为什么。

这是文件系统布局:

λ tree /F
Folder PATH listing
Volume serial number is F029-7357
C:.
│   B.py
│   requirements-tox.txt
│   tox.ini
│
├───app_C
│   └───tests
│           test_C.py
│
└───common
        A.py

common\A.py

import pytest


class ATestClass():

    @pytest.mark.dependency(name='test_a')
    def test_a(self):
        assert True

B.py

import pytest
from common.A import ATestClass


class BTestClass(ATestClass):

    @pytest.mark.dependency(name='test_b', depends=['test_a'])
    def test_b(self):
        assert True

test_C.py

import pytest
import sys


sys.path.append('.')
from B import *


class TestC(BTestClass):

    @pytest.mark.dependency(name='test_c', depends=['test_b'])
    def test_c(self):
        assert True

pytest 输出:

λ tox -- -rs
py38 installed: ...
py38 run-test-pre: PYTHONHASHSEED='367'
py38 run-test: commands[0] | pytest -x -v -rs
=============================================== test session starts ===============================================
platform win32 -- Python 3.8.1, pytest-6.1.1, py-1.9.0, pluggy-0.13.1 -- ...\poc\.tox\py38\scripts\python.exe
cachedir: .tox\py38\.pytest_cache
rootdir: ...\poc
plugins: dependency-0.5.1
collected 3 items

app_C/tests/test_C.py::TestC::test_b SKIPPED                                                                 [ 33%]
app_C/tests/test_C.py::TestC::test_c SKIPPED                                                                 [ 66%]
app_C/tests/test_C.py::TestC::test_a PASSED                                                                  [100%]
============================================= short test summary info =============================================
SKIPPED [1] .tox\py38\lib\site-packages\pytest_dependency.py:103: test_b depends on test_a
SKIPPED [1] .tox\py38\lib\site-packages\pytest_dependency.py:103: test_c depends on test_b
===================================== 1 passed, 2 skipped, 1 warning in 0.14s =====================================
_____________________________________________________ summary _____________________________________________________
  py38: commands succeeded
  congratulations :)

知道为什么test_b 被跳过而不执行吗?

编辑:如果我让BTestClass 独立,从图片中删除A / ATestClass,它工作正常。

collected 2 items

app_C/tests/test_C.py::TestC::test_b PASSED [ 50%]
app_C/tests/test_C.py::TestC::test_c PASSED [100%]

【问题讨论】:

common\A.py 中似乎有test_C.py 的内容 - 复制粘贴错误? 是的,已更正,谢谢。 【参考方案1】:

pytest-dependency 中,对另一个测试的依赖意味着该测试在依赖测试之前运行。如果不是这种情况(在您的示例中,test_btest_a 之前运行,因为test_a 位于子目录中),则只是跳过测试。 pytest-dependency 不会对测试进行任何重新排序(很遗憾)。

如果您无法通过命名轻松确定运行测试的顺序,您可以使用pytest-ordering 插件将测试带入所需的顺序。在你的情况下,你可以这样做:

class ATestClass:
    @pytest.mark.dependency(name='test_a')
    @pytest.mark.run(order=0)
    def test_a(self):
        assert True
...
class BTestClass(ATestClass):
    @pytest.mark.dependency(name='test_b', depends=['test_a'])
    @pytest.mark.run(order=1)
    def test_b(self):
        assert True

在这种情况下,测试按test_a - test_b - test_c 的顺序运行,所有测试都会运行。

更新: 你也可以使用pytest-order,它是pytest-ordering的一个分支。如果您使用 pytest 选项 --order-dependencies,它将尝试使用 pytest-dependencies 创建的依赖项重新排序测试,而无需添加额外的标记。

免责声明:我是那个分叉的作者。

【讨论】:

以上是关于pytest 不承认基类中的 PASSED 依赖项导致派生类中的 SKIPPED 测试的主要内容,如果未能解决你的问题,请参考以下文章

11-pytest-assert断言

计算插件依赖

为啥 Type.GetFields() 不返回基类中的支持字段?

使用 pytest 测试 __init__.py 中可选依赖项的导入:Python 3.5 /3.6 的行为不同

安卓||在 Hilt 不支持的类中注入依赖项,例如 Helper 类

如何检查几何基类中的碰撞而不转换为派生类