3

伙计们,

假设我有一个定期运行的复杂的子类测试套件。作为其中的一部分,我试图确保每个测试类一个接一个地严格执行,并且在's完成之前不会启动' Test2s方法。这是一个有效的假设吗?@BeforeClassTest1@AfterClass

示例场景:

TestBase有一个@BeforeClass和一个@AfterClass方法。

T1派生自TestBase.

T2派生自`TestBase。

我们从 Ant / Eclipse 一起运行T1和运行。T2有一些来自 TestBase 的常见静态对象在T1and之间重用T2,这意味着我必须完全确定这些对象AfterClass在下一轮BeforeClass开始初始化之前完全销毁。我可以通过上面概述的基本用法确定这一点吗?

我强烈怀疑这不会发生,但简单的测试并不能证明是一样的。文档也没有谈论这个。所以我想确保我不会试图解决一个可以通过其他方式解决的系统性问题。

4

1 回答 1

2

排除并行执行,JUnit 应该总是在之后运行一个测试类,即 T1 在 T2 之前(或相反),所以你的场景应该可以工作。

要注意的另一件事是运行测试的顺序,这可能会混淆问题。请参阅我对Has JUnit4 是否开始支持测试排序的回答?是故意的吗?,这解释了为什么测试可能以不同的顺序执行。

我认为您最好的解决方案是使用ClassRule。这允许您定义一个实现您的AfterClass&BeforeClass行为的类。例如:

public class UsesExternalResource {
  public static Server myServer= new Server();

  @ClassRule
  public static ExternalResource resource= new ExternalResource() {
    @Override
    protected void before() throws Throwable {
      myServer.connect();
    };

    @Override
    protected void after() {
      myServer.disconnect();
    };
  };
}

使用它可以消除对静态变量的需要,因为您可以在 中进行所有设置ClassRule,所有内容都可以是其中的实例变量。您也许可以TestBase完全删除父类。

于 2012-09-19T06:38:39.437 回答