Best practices: fail() vs assertTrue(false)
当故意使测试用例失败时(例如,当没有抛出异常时)我看到人们同时使用fail()和assertTrue(false)。 使用其中一个有什么好处吗?
1 2 3 4
| try {
//method call that should throw exception
fail ("oops");
} catch (Exception e ) {} |
与
1 2 3 4
| try {
//method call that should throw exception
assertTrue ("oops", false);
} catch (Exception e ) {} |
-
你为什么想要考试不及格?
-
当应该抛出异常但不是。你不同意我的例子吗?
-
例外应该是一个例外。一个好的代码永远不应该期望一个异常,你的代码应该在它被抛出之前避免异常。
-
@Victor通常我同意,但如果你有一个复杂的异常堆栈(许多自定义异常,可能冒泡)你可能希望确保在不同的情况下抛出正确的异常。
-
@Victor我认为你一直在编写单元测试错误,如果你从来没有测试异常会在错误情况下被抛出。您想要检查故障路径以及成功路径。这通常需要检查是否抛出了异常。
-
@Victor我如何单元测试我的方法抛出正确的异常呢?
-
我相信正确的是@BeRecursive回答。强制错误。
-
@Victor我认为BeRecursive的答案是有效的,但我正在开发一个相对较大的项目,测试框架已经很好地建立,目前我们只使用assert / fail语句。现在引入@Test注释会引入不一致,在我看来,不值得花费额外的代码和时间来编辑所有现有的测试用例。特别是因为我认为这样做并没有获得巨大收益。
Are there any advantages to using one or the other?
功能上,没有。 但是,fail()更清楚地表达了意图,因此更好。
在@Test注释中使用JUnit的expected参数
1 2 3 4
| @Test (expected = ArithmeticException. class)
public void divisionWithException () {
int i = 1/0;
} |
如果未抛出ArithmeticException,则会失败。
-
OP确实说"例如,当没有抛出异常时"可能还有其他情况。
-
我发现EpectedException规则是一种更强大的机制,用于测试预期的异常,因为它可以放在测试方法之前,从而确保它不是引发异常的测试设置。
-
但我们期待抛出异常。所以,如果不是,它应该失败。为什么要使用try / catch逻辑呢?我们想要例外。
-
与NullUserException一致
-
如何添加要显示给用户的失败消息?喜欢失败("失败消息")。
-
@NullUserException我只是不明白为什么你会故意失败测试。测试中的重点是确保某些事情按照预期的方式发生。不要确保它失败的无限可能方式没有发生。如果它没有做你明确声明的那样,那么它应该失败。您不应该明确说明它不应该失败的所有方式。
-
@Trevor在这个答案中看到了Junit4的备用ExpectedException用法:stackoverflow.com/questions/2469911/…
-
@BeRecursive你不能总是让junit捕获异常。您可能希望自己捕获异常,以便测试它是否正确。
-
我不得不同意@JohnB - 我多次使用try / catch机制,因为这是在大于3-4行的任何测试方法中测试错误的东西。例如,我不希望在设置对象时抛出异常,但我确实希望在测试方法期间抛出异常。如果在安装过程中出现错误,即使测试失败,测试也会通过。
-
@Izkata虽然这是可能的,但在测试期间的任何时候都不太可能抛出相同的异常。如果抛出了错误的异常类,则测试仍然失败。尽管如此,如果您想测试一些关于异常的特定内容,您可以使用ExpectedException,如上所述。
-
@BeRecursive关于你对Izkata的回应,当我期待NullPointerException并且测试通过因为它是从错误的地方抛出时,我已经看到了很多次。不要过分夸大这个主题,但根据我的经验,在处理NPE,IAE和Runtime等异常时并非"非常不可能"。
-
@JohnB我觉得很奇怪,你会期待一个NullPointerException?当然这是抛出时始终是错误的异常之一?即使在一些利基案例中,您可能希望它在堆栈跟踪中更早被抛出,我希望您能够捕获它并将其包装在自定义Exception中。那么你会期待你的自定义异常。
-
我在任何公共方法中测试的第一件事是,如果为@Nonnull参数传递null,它会抛出一个NPE。出于这个原因,谷歌提供了一个帮助:NullPoinerTester并且Effective Java极力鼓励这一点
-
我使用ExpectedException的另一种方法是,如果我有一个方法需要多个参数并对参数进行验证(所有公共方法都应该这样做),从而抛出多个不同的IllegalArgumentExceptions。 ExpectedException允许我测试消息以确保我收到正确的异常。
-
我不是说@Test(expected)没有地方。但我只在单行测试中使用它,其中被测方法只能从一个位置/在一个条件中抛出预期的异常。
-
@JohnB我完全同意你关于ExpectedException的信息,我也经常遵循这个工作流程。关于自己投掷NullPointerException,我想这是一个常规问题。我个人非常不喜欢这种做法,更喜欢类似IllegalArgumentException或IllegalStateException的东西。
-
我已经被Guava的Preconditions类转换,它从checkNotNull抛出一个NPE。 在开始使用之前,我对投掷NPE感到奇怪。 同样,Effective Java指出从参数验证中抛出NPE,IAE和ISE是合适的。 好好讨论,欢呼!docs.guava-libraries.googlecode.com/git-history/release/javadoc/…
assertTrue只是调用失败。
恕我直言失败()更简单,更清晰。
使用fail,否则有人会查看日志中的失败并思考"什么是假的,应该是真的"。
两者都可以使用(虽然fail更好,因为这是真正意图的),但由于你使用的是JUnit,你可以使用@Test(expected=MyException.class)代替。