pytest 不承认基础 class 中的 PASSED 依赖导致派生 class 中的跳过测试
pytest not acknowledging PASSED dependency in base class results in SKIPPED tests in derived class
我有这个小项目,我使用 pytest 和 pytest-dependency 以及 tox在某些代码上开发集成测试。到目前为止,我使用了一个基础 class (BTestClass
),在根目录中进行了一些常见测试,并在其旁边的 test_Component.py file
中对每个代码组件进行了特定测试,实现了 TestC
class 继承自 BTestClass
.
在那之前一切正常。现在我想为另一组组件添加一个 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%]
在 pytest-dependency
中,对另一个测试的依赖意味着该测试在依赖测试之前 运行s。如果不是这种情况(在您的示例中 test_b
是 test_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
,它将尝试 re-order 具有由 pytest-dependencies
创建的依赖项的测试,而无需添加额外的标记。
免责声明:我是那个叉子的作者。
我有这个小项目,我使用 pytest 和 pytest-dependency 以及 tox在某些代码上开发集成测试。到目前为止,我使用了一个基础 class (BTestClass
),在根目录中进行了一些常见测试,并在其旁边的 test_Component.py file
中对每个代码组件进行了特定测试,实现了 TestC
class 继承自 BTestClass
.
在那之前一切正常。现在我想为另一组组件添加一个 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%]
在 pytest-dependency
中,对另一个测试的依赖意味着该测试在依赖测试之前 运行s。如果不是这种情况(在您的示例中 test_b
是 test_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
,它将尝试 re-order 具有由 pytest-dependencies
创建的依赖项的测试,而无需添加额外的标记。
免责声明:我是那个叉子的作者。