如果有
,你如何进行单元测试?举个例子,想象一下测试一个CSV阅读器(我只是为演示编写了一个表示法),
def test_readCsv(): ...
@dependsOn(test_readCsv)
def test_readCsv_duplicateColumnName(): ...
@dependsOn(test_readCsv)
def test_readCsv_unicodeColumnName(): ...
我希望只有在父测试成功的情况下才能运行子测试。这背后的原因是运行这些测试需要时间。许多失败的报告可以归结为一个原因也不会提供信息。当然,我可以把所有边缘情况都塞进主要测试中,但我想知道是否有更有条理的方法来做到这一点。
我发现了这些相关但不同的问题,
更新:
我发现TestNG对测试依赖项有很好的内置支持。你可以写这样的测试,
@Test{dependsOnMethods = ("test_readCsv"))
public void test_readCsv_duplicateColumnName() {
...
}
答案 0 :(得分:10)
就个人而言,我不担心在单元测试之间创建依赖关系。这对我来说听起来有点像代码味道。几点:
答案 1 :(得分:5)
Proboscis 是 TestNG 的python版本(它是一个Java库)。
请参阅packages.python.org/proboscis/
它支持依赖关系,例如
@test(depends_on=[test_readCsv])
public void test_readCsv_duplicateColumnName() {
...
}
答案 2 :(得分:2)
我不确定你指的是哪种语言(因为你没有在你的问题中特别提到它)但是对于像PHPUnit这样的东西,有一个@depends标签只会运行测试依赖于测试已经过去了。
根据您使用的语言或单元测试,可能还有类似的可用
答案 3 :(得分:2)
我已经为Nose(Python)实现了一个插件,它增加了对测试依赖性和测试优先级的支持。
正如其他答案/评论中所提到的,这通常是一个坏主意,但是可能存在例外情况,你想要这样做(在我的情况下,它是集成测试的性能 - 进入可测试的开销很大州,分钟与小时)。
您可以在此处找到它:nosedep。
最小的例子是:
def test_a:
pass
@depends(before=test_a)
def test_b:
pass
确保test_b
始终在test_a
之前运行。
答案 4 :(得分:1)
您可能要使用pytest-dependency。根据他们的文档,代码看起来很优雅:
import pytest
@pytest.mark.dependency()
@pytest.mark.xfail(reason="deliberate fail")
def test_a():
assert False
@pytest.mark.dependency()
def test_b():
pass
@pytest.mark.dependency(depends=["test_a"])
def test_c():
pass
@pytest.mark.dependency(depends=["test_b"])
def test_d():
pass
@pytest.mark.dependency(depends=["test_b", "test_c"])
def test_e():
pass
请注意,它是pytest的插件,而不是unittest
的插件,它是python本身的一部分。因此,您还需要2个依赖项(例如,添加到requirements.txt
中):
pytest==5.1.1
pytest-dependency==0.4.0
答案 5 :(得分:-1)
根据最佳实践和单元测试原则,单元测试不应依赖于其他测试。
每个测试用例都应该检查具体的孤立行为。
然后,如果某个测试用例失败,您将确切知道我们的代码出了什么问题。