setUp/tearDown (@Before/@After) 为什么我们在 JUnit 中需要它们?

新手上路,请多包涵

相信大家都知道setUp(@Before)会在任何测试方法之前执行,tearDown(@After)会在测试方法之后执行。

我们还知道 Junit 将为 每个测试方法 创建一个 Test 实例。

我的问题是我们可以将 setUp 方法内容移动到类 Constructor 并删除 setUp 方法吗?是否有任何特定原因保留 setUp 方法?

原文由 mhshams 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 750
2 个回答

这篇(旧的) JUnit 最佳实践 文章是这样说的:

不要使用测试用例构造函数来设置测试用例

在构造函数中设置测试用例不是一个好主意。考虑:

 public class SomeTest extends TestCase
   public SomeTest (String testName) {
      super (testName);
      // Perform test set-up
   }
}

想象一下,在执行设置时,设置代码抛出一个 IllegalStateException 。作为响应,JUnit 将抛出一个 AssertionFailedError ,表明无法实例化测试用例。这是生成的堆栈跟踪的示例:

 junit.framework.AssertionFailedError: Cannot instantiate test case: test1
    at junit.framework.Assert.fail(Assert.java:143)
    at junit.framework.TestSuite.runTest(TestSuite.java:178)
    at junit.framework.TestCase.runBare(TestCase.java:129)
    at junit.framework.TestResult.protect(TestResult.java:100)
    at junit.framework.TestResult.runProtected(TestResult.java:117)
    at junit.framework.TestResult.run(TestResult.java:103)
    at junit.framework.TestCase.run(TestCase.java:120)
    at junit.framework.TestSuite.run(TestSuite.java, Compiled Code)
    at junit.ui.TestRunner2.run(TestRunner.java:429)

这个堆栈跟踪证明信息量不大;它仅表示无法实例化测试用例。它没有详细说明原始错误的位置或起源地。这种信息的缺乏使得很难推断出异常的根本原因。

不是在构造函数中设置数据,而是通过覆盖 setUp() 来执行测试设置。正确报告在 setUp() 中抛出的任何异常。将此堆栈跟踪与前面的示例进行比较:

 java.lang.IllegalStateException: Oops
    at bp.DTC.setUp(DTC.java:34)
    at junit.framework.TestCase.runBare(TestCase.java:127)
    at junit.framework.TestResult.protect(TestResult.java:100)
    at junit.framework.TestResult.runProtected(TestResult.java:117)
    at junit.framework.TestResult.run(TestResult.java:103)
    ...

这个堆栈跟踪提供了更多信息;它显示抛出了哪个异常( IllegalStateException )以及从哪里抛出。这使得解释测试设置失败变得容易得多。

原文由 Pascal Thivent 发布,翻译遵循 CC BY-SA 2.5 许可协议

在工作中,我们发现了一些非常有趣的东西,可以回答您的问题。当您运行测试套件时,尤其是大量测试(200 多个)时,JUnit 开始使用大量内存。这是因为所有测试都是在运行任何实际测试方法之前实例化的。

因此,我们遇到了“内存泄漏”。因为我们使用 Spring 为我们的数据库测试连接了一些 JPA EntityManager 对象,这变成了很多对象和大量内存,并且在测试进行到大约一半的时候我们遇到了 OutOfMemory 异常。

恕我直言,最佳做法是使用 setUp 和 tearDown 来注入您的依赖项并清空任何和所有类引用。这将使您的测试运行得更快,并为您省去很多麻烦!

希望你从我们的错误中吸取教训:)

原文由 BjornS 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题