我应该没有测试失败吗?

时间:2014-12-29 19:44:16

标签: unit-testing

请注意:我不是在征求您的意见。我问的是约定。

我只是想知道我是否应该使用适当的方法名称进行传递和失败测试,​​例如Should_Fail_When_UsageQuantityIsNegative()Should_Fail_When_UsageQuantityMoreThan50()Should_Pass_When_UsageQuantityIs50()

或者,我应该编写它们来传递并保持所有测试都处于通过状态吗?

4 个答案:

答案 0 :(得分:12)

创建单元测试时,它们都应该通过。这并不意味着你不应该测试"失败"案例。它只是意味着测试应该在它失败时通过。"

这样,您不必经历(最好)大量测试,并手动检查正确的测试是否通过并失败。这几乎违背了自动化的目的。

正如Mark Rotteveel在评论中指出的那样,仅仅测试一些失败的东西并不总是足够的。确保失败是正确的失败。例如,如果您使用错误代码且error_code等于0表示成功并且您想确保失败,请不要测试error_code != 0 ;相反,例如测试error_code == 19正确失败的错误代码是什么。

修改

我想补充一点。虽然您部署的代码的最终版本不应该有失败的测试,但确保编写正确代码的最佳方法是在之前编写测试,然后编写其余的代码。在对源代码进行任何更改之前,编写一个单元测试(或理想情况下,一些单元测试),现在应该失败(或无法编译),但在完成更改后通过。这是确保您编写的测试正在测试正确的事情的好方法。因此,总而言之,您的最终产品不应该有失败的单元测试;但是,软件开发过程包括您已编写尚未通过的单元测试的期间。

答案 1 :(得分:5)

除非你的程序以不适合的方式行事,否则你不应该有失败的测试。

如果程序的预期行为是失败的,并且失败了,那么应该触发测试通过。

如果程序在一个应该失败的地方通过,那么代码部分的测试就会失败。

总之,除非所有测试都通过,否则程序无法正常工作。

答案 2 :(得分:2)

你应该永远不会有失败的测试,正如其他人所指出的那样,这就失去了自动化的目的。您可能需要的是在输入不正确时验证代码是否按预期工作的测试。查看示例Should_Fail_When_UsageQuantityIsNegative()是一个应传递的测试,但您所做的断言取决于 fail 的含义。例如,如果您的代码在使用数量为负时应抛出IllegalArgumentException,那么您可能会进行如下测试:

@Test(expected = IllegalArgumentException.class)
public void Should_Fail_When_UsageQuantityIsNegative() {
    // code to set usage quantity to a negative value
}

答案 3 :(得分:1)

如果测试失败,有几种不同的方法来解释问题。

Should_Fail_When_UsageQuantityMoreThan50()这样的测试应该是一个通过测试,它会检查是否会引发相应的错误。 Throws_Exception_When_UsageQuantityMoreThan50()等。许多测试套件都有用于测试异常的特殊工具:JUnit's expected parameter和Perl模块,例如Test::Exception,甚至可以test for warnings

测试应该在开发过程中失败,这意味着他们正在做自己的工作。你应该怀疑一个永不失败的测试套件,它的覆盖范围可能很差。失败的测试将捕获开发人员或测试或代码对公共行为,错误和其他错误的更改。但是当提交和推送时,测试应该返回传递。

最后,在合法的情况下,您有一个已知的错误或缺失的功能,目前无法修复或实施。有时错误是偶然修复的,因此为它编写测试是好的。当它通过时,你知道错误已被修复,并且你想要在它开始通过时发出通知。不同的测试系统允许您编写预期会失败的测试,并且只有在通过时才会显示。在Perl中,这是TODO or expected failure。 POSIX有许多结果,例如UNRESOLVED, UNSUPPORTED and UNTESTED来涵盖这种情况。