我可以确保所有测试都包含测试/单元中的断言吗?

时间:2010-06-11 02:42:25

标签: ruby unit-testing testunit minitest

使用test / unit和minitest,是否可能使任何不包含断言的测试失败,或者需要进行猴子修补(例如,检查每次测试执行后断言计数是否增加)?

背景:我不应该写unit tests without assertions - 至少,我应该使用assert_nothing_raised,如果我正在进行烟雾测试,以表明我正在进行烟雾测试。

通常我会编写首先失败的测试,但我正在编写一些回归测试。或者,我可以提供不正确的预期值,以查看测试是否正在比较预期值和实际值。

3 个答案:

答案 0 :(得分:1)

为确保单元测试能够实际验证任何名为Mutation testing的技术。

对于Ruby,您可以查看Mutant

答案 1 :(得分:0)

正如PK的链接所指出的那样,断言的存在本身并不意味着单元测试是有意义和正确的。我相信没有自动替代仔细的思考和意识。

确保测试首先失败是一种很好的做法,应该养成习惯。

除了你提到的东西之外,我经常在新测试中的断言中设置错误的值,以检查测试是否真正运行并失败。 (然后我当然修理它:-)这比编辑生产代码更不突兀。

答案 2 :(得分:0)

我真的不认为在没有断言的情况下强制测试失败是非常有帮助的。在测试中使用断言本身并不是目标 - 目标是编写有用的测试

缺少的断言只是表明测试可能无效。有趣的问题是:如果出现问题,测试会失败吗?。如果没有,那显然没用。

如果您正在测试的是代码没有崩溃,那么围绕它的assert_nothing_raised只是一种评论。但测试“无爆炸”可能表明测试本身就是一个弱点。在大多数情况下,它不会为您提供有关您的代码的任何有用信息(因为“没有崩溃!=正确”),那么为什么您首先编写测试?另外,我更喜欢一种方法,它可以正确地爆炸,只返回错误的结果。

我发现最好的回归测试来自现场:敲你的应用程序(或让你的测试人员这样做),并且对于你发现的每个问题都写了一个失败的测试。修复它,并通过测试。

否则我会测试行为,而不是没有崩溃。如果我有“空”测试(意味着我还没有编写测试代码),我通常会在里面放一个#flunk来提醒我。