Unit testing 没有断言的单元/集成测试是否存在?

Unit testing 没有断言的单元/集成测试是否存在?,unit-testing,Unit Testing,最近我不得不有机会看到一系列没有任何断言的测试。这些测试必须是准确性测试 我认为,使用此类测试可以测试的唯一事情是检查在执行流期间是否没有引发异常。但无论如何,我真的不明白如何在没有断言测试的情况下验证代码的准确性——即使是什么都不做的方法也能通过这样的测试 所以我想知道这样的测试的目的是什么,还有什么可以用它来测试?有时候,知道一段代码可能被执行是很有趣的 例如,我对生成图形输出的(Python)代码执行此操作。我很高兴能创作出这样的图形。当测试失败时,我知道有些东西坏了。这里有一个例子(C#

最近我不得不有机会看到一系列没有任何断言的测试。这些测试必须是准确性测试

我认为,使用此类测试可以测试的唯一事情是检查在执行流期间是否没有引发异常。但无论如何,我真的不明白如何在没有断言测试的情况下验证代码的准确性——即使是什么都不做的方法也能通过这样的测试


所以我想知道这样的测试的目的是什么,还有什么可以用它来测试?

有时候,知道一段代码可能被执行是很有趣的

例如,我对生成图形输出的(Python)代码执行此操作。我很高兴能创作出这样的图形。当测试失败时,我知道有些东西坏了。

这里有一个例子(C#,NUnit):

如果该测试通过,则可确保以下各项:

  • 构造函数不会抛出异常
  • Startup()不会引发异常
  • ShutDown()不会引发异常
这三件物品都很有价值,甚至可能是史诗。你会惊讶地发现,有多少商业应用程序甚至没有像这样的基本内容作为其QA过程的一部分


因此,是的,没有断言的测试也有其价值。

是的,正如@John和@Olivier所指出的,仅仅知道一些代码运行时没有抛出异常(我想不用说,没有编译错误)有时是有价值的。但这是罕见的情况,在任何情况下我都不会考虑这些“精确性”测试。

< P>他们可能是设计用来证明没有抛出异常或其他东西的冒烟测试。p>
我认为你应该重新命名这些测试的原因是什么?如果人们不知道它们存在的原因或者它们正在测试什么,那么如果它们确实损坏了,如何修复它们。

如果它们正在测试一些“遗留代码”——没有人真正掌握的代码,我会让它们拥有存在的权利。不,如果他们在那里展示“高代码覆盖率”

这是对代码有信心的第一步。不可见的检查是:“不会引发异常”。然而,一旦你在这些冒烟测试中结束了应用程序,下一步将是将隐式检查转化为显式检查——戴上你的思维帽,提出你可以从测试中断言的可观察到的变化。

您可以使用诸如TestLint之类的工具来捕获这样的测试。

IMHO,测试需要测试行为,而不是缺少行为。如果要测试异常,请测试异常。邮递也许这些测试是为了让测试的汁液流动起来,但它们不应该存在太久。

嗯,不

没有断言的测试显然是一种设计气味。这是因为一个好的测试必须通过代码准确地传达它正在测试的内容,而且它还必须是可信的

形式检验

[Test]
public void DoSomethingDoesNotThrow()
{
   var aService = new Service();
   aService.DoSomething();
}
没有意义,甚至可能有害,因为不管service.DoSomething()在做什么,它都会通过。但最大的问题是:它不能测试任何东西。(顺便说一句:这个测试怎么可能是‘准确度’?)

最好测试
aService.DoSomething()
的一些功能!如果这样的测试通过了,那么您知道不会发生异常,那么为什么还要像上面那样进行“测试”

总的来说:总是测试事实,永远不要缺少这些事实

仅仅因为这在现实世界中经常发生,并不意味着这是一个好的实践


Thomas

我最近遇到了一个与命名不正确的类相关的bug,因此编写了一个测试来检查是否存在正确命名的类(可以实例化)

很自然,测试失败了,我认为这里不需要断言

修复类名会导致通过测试,并询问自己是否也需要断言

最后,我只是断言所创建的类的类型是正确的,这似乎毫无意义,但无论如何还是这样做了

在这个场景中,我仍然觉得断言不是必需的


对此有何想法?

似乎例外情况用于非例外情况(如验证)。这就是这些测试在本文中指出的“糟糕的设计”,我想用try/catch包装并粘贴Assert.Fail将是一件好事,因为您知道这些测试实际上是要测试什么。@mlk:我同意应该更清楚这个测试在做什么。我没有添加try/catch和
Assert.Fail()
而是将答案中的名称从
StartUpShutDown
更新为
startupshutdowndesnthrow
。是的,很高兴知道没有引发异常。但是为什么不添加一些检查来验证服务是否正确工作呢?我同意这样的测试比什么都不做要好,但为什么不让它成为必须的呢?@DixonD:我不确定测试“必须是怎样的”。根据我的经验,有太多的场景/因素,几乎总是没有“对”或“错”,但“有效”、“不起作用”、“足够好”、多个选项等等。我同意你的观点,在一般情况下,通过添加断言可以使测试变得更有价值。我的逻辑很简单-测试的目的是验证代码不仅“有效”但是“工作正常”:)是的,我同意你的观点——这类测试可以同时存在,但最后应该添加对测试逻辑的显式检查。顺便说一句,谢谢你给我指出TestLint,我会找到它的。如果你没有测试它,你怎么知道图形会被创建呢?:)我没有。当代码毫无例外地运行时,我很高兴。
[Test]
public void DoSomethingDoesNotThrow()
{
   var aService = new Service();
   aService.DoSomething();
}