请注意:我不是在征求您的意见。我问的是约定。
我只是想知道我是否应该使用适当的方法名称进行传递和失败测试,例如Should_Fail_When_UsageQuantityIsNegative()
,Should_Fail_When_UsageQuantityMoreThan50()
,Should_Pass_When_UsageQuantityIs50()
。
或者,我应该编写它们来传递并保持所有测试都处于通过状态吗?
答案 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来涵盖这种情况。