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

时间:2010-08-06 13:43:17

标签: unit-testing

最近我不得不在没有任何断言的情况下看到一堆测试。那些测试必须是准确性测试。

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

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

8 个答案:

答案 0 :(得分:5)

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

这是获得代码信心的第一步。隐形检查是:“没有抛出异常”。然而,一旦你在这些烟雾测试中结束了应用程序,下一步就是将隐式检查变成一个明确的检查 - 放在你的思维上限,并提出你可以从测试中断言的可观察的更改。
您可以使用TestLint等工具来捕获这些测试。

答案 1 :(得分:4)

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

[Test]
public void StartUpShutDownDoesntThrow() {
   var aService = new Service();
   aService.StartUp();
   aService.ShutDown();
}

如果此测试通过,则确保以下内容:

  • 构造函数不会抛出异常
  • Startup()不会抛出异常
  • ShutDown()不会抛出异常

这三件物品都很有价值,甚至可能是史诗般的。你会惊讶地发现有多少商业应用程序甚至没有像QA流程那样基本的东西。

所以,是的,没有断言的测试也有其价值。

答案 2 :(得分:3)

嗯,不!

没有Assert的测试显然是一种设计气味。这是因为一个好的测试必须通过代码正确地进行通信测试,并且它也必须值得信赖。

表格测试

[Test]
public void DoSomethingDoesNotThrow()
{
   var aService = new Service();
   aService.DoSomething();
}

毫无意义,甚至可能有害,因为无论aService.DoSomething()`做什么,它都会通过。但最大的问题是:它没有测试任何东西。 (顺便说一句:这怎么能测试'准确性'?)

最好测试aService.DoSomething()的某些功能!如果这样的测试通过,你知道没有异常发生,那么为什么你还需要像上面这样的“测试”呢?

总的来说:总是测试事实,而不是缺少这些事实。

只是因为它经常在现实世界中完成并不能使它成为一种好习惯......

托马斯

答案 3 :(得分:1)

它们可能是烟雾测试,旨在证明某些东西不会抛出异常或其他东西正在抛出这样的工作(例如模拟对象)。

我认为你应该重新命名这些测试的原因就好像人们不知道他们为什么存在或他们正在测试他们如何在他们确实破坏时修复它们。

答案 4 :(得分:1)

恕我直言,测试需要测试行为,而不是缺乏行为。如果要测试异常,请测试异常。 Read this blog发帖。也许这些测试是测试以使测试果汁流动,但它们不应该存在很长时间。

答案 5 :(得分:0)

有时候知道可以执行一段代码是很有趣的。

我这样做是为了生成图形输出的(Python)代码。我很高兴图形创建完全。当测试失败时,我知道某些事情已经破裂。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我最近遇到了一个与命名不正确的类有关的错误,所以写了一个测试来检查正确命名的类是否存在(可以实例化)。

当然测试失败了,我在这里没有看到Assert的需要。

修复课程名称会导致通过测试,并在此处询问我是否需要Assert。

最后,我只断言已经创建的类是正确的类型,这看起来毫无意义,但无论如何都做了。

在这种情况下,我仍然觉得Assert不是必需的。

对此有何想法?