TestNG:如何测试强制例外?

我想编写一个TestNG测试来确保在特定条件下抛出exception,如果没有抛出exception,则测试失败。 有没有必要创建一个额外的布尔变量的简单方法?

关于此主题的相关博客文章: http : //konigsberg.blogspot.com/2007/11/testng-and-expectedexceptions-ive.html

@Test(expectedExceptions)对最常见的情况很有用:

  • 您希望抛出特定的exception
  • 您需要该exception的消息才能包含特定的单词

根据文档,如果没有抛出expectedException测试将失败:

预期测试方法抛出的exception列表。 如果抛出此列表中没有exception或不同exception,则此测试将标记为失败。

以下是@Test(expectedExceptions)不足的几种情况:

  • 您的测试方法有几个语句,预计只会抛出其中一个语句
  • 你抛出自己的exception类型,你需要确保它符合某个标准

在这种情况下,您应该恢复到传统的(pre-TestNG)模式:

 try { // your statement expected to throw fail(); } catch() { // pass } 
 @Test(expectedExceptions = AnyClassThatExtendsException.class, expectedExceptionsMessageRegExp = "Exception message regexp") 

或者,如果您不想检查exception消息,只有下面就足够了

 @Test(expectedExceptions = AnyClassThatExtendsException.class) 

这样,你不需要使用丑陋的try catch块,只需在测试中调用exception-thrower方法。

我不同意有关所用测试技术性质的文章。 该解决方案采用门,以validation测试在中间阶段是成功还是失败。

在我看来,最好采用Guard Assertions ,特别是对于这样的测试(假设测试结果并不是冗长而复杂的,这本身就是一种反模式)。 使用guard-assertions强制您通过以下任一方式设计SUT:

  • 设计方法本身,在结果中提供关于调用是通过还是成功的足够信息。 有时,这是不可能的,因为设计者的意图是不返回结果,而是抛出exception(这可以在第二种情况下处理)。
  • 设计SUT,以便在每次重要的方法调用后validation它的状态 。

但在我们考虑上述可能性之前,请再次查看以下代码段:

 plane.bookAllSeats(); plane.bookPlane(createValidItinerary(), null); 

如果打算测试bookPlane()并validation执行该方法,最好在fixture中使用bookAllSeats()。 在我的理解中,调用bookAllSeats()相当于设置SUT以确保bookPlane()的调用失败,因此有一个夹具来做同样的事情会使更可读的测试。 如果意图不同,我建议在每次转换后测试状态(正如我通常在function测试中所做的那样),以帮助查明失败的原始原因。

为什么不使用链接到的博客文章中提到的try / fail / catch模式?

catch-exception可能提供测试预期exception所需的一切。