单元测试与测试之间的依赖关系

时间:2010-10-01 21:29:43

标签: unit-testing code-organization

如果有

,你如何进行单元测试?
  • 一些一般单元测试
  • 更复杂的测试检查边缘情况,具体取决于一般情况

举个例子,想象一下测试一个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() {
   ...
}

6 个答案:

答案 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)

根据最佳实践和单元测试原则,单元测试不应依赖于其他测试。

每个测试用例都应该检查具体的孤立行为。

然后,如果某个测试用例失败,您将确切知道我们的代码出了什么问题。