JUnit 4:在测试运行之前在测试套件中设置内容(例如测试的@BeforeClass方法,仅用于测试套件)

我想在(宁静的)Web服务上进行一些功能测试。testuite 包含一堆测试用例,每个测试用例都在 Web 服务上执行几个 HTTP 请求。

当然,Web 服务必须运行,否则测试将失败。:-)

启动 Web 服务需要几分钟时间(它会执行一些繁重的数据提升),因此我想尽可能少地启动它(至少所有只有来自服务的 GET 资源才能共享的测试用例)。

那么,有没有办法在测试套件中设置炸弹,然后再像在测试用例的@BeforeClass方法中一样运行测试?


答案 1

现在的答案是在您的套件中创建一个。该规则将在运行每个测试类之前或之后(取决于实现方式)调用。您可以扩展/实现几个不同的基类。类规则的好处在于,如果您不将它们实现为匿名类,那么您可以重用代码!@ClassRule

这是一篇关于他们的文章:http://java.dzone.com/articles/junit-49-class-and-suite-level-rules

下面是一些示例代码来说明它们的用法。是的,这是微不足道的,但它应该很好地说明生命周期,以便您开始。

首先是套件定义:

import org.junit.*;
import org.junit.rules.ExternalResource;
import org.junit.runners.Suite;
import org.junit.runner.RunWith;


@RunWith( Suite.class )
@Suite.SuiteClasses( { 
    RuleTest.class,
} )
public class RuleSuite{

    private static int bCount = 0;
    private static int aCount = 0;

    @ClassRule
    public static ExternalResource testRule = new ExternalResource(){
            @Override
            protected void before() throws Throwable{
                System.err.println( "before test class: " + ++bCount );
                sss = "asdf";
            };

            @Override
            protected void after(){
                System.err.println( "after test class: " + ++aCount );
            };
        };


    public static String sss;
}

现在测试类定义:

import static org.junit.Assert.*;

import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExternalResource;

public class RuleTest {

    @Test
    public void asdf1(){
        assertNotNull( "A value should've been set by a rule.", RuleSuite.sss );
    }

    @Test
    public void asdf2(){
        assertEquals( "This value should be set by the rule.", "asdf", RuleSuite.sss );
    }
}

答案 2

jUnit不能做那种事情 - 尽管TestNG确实有注释。通常,您可以让构建系统执行此操作。在maven中,有“前集成测试”和“后集成测试”阶段。在ANT中,您只需将步骤添加到任务中即可。@BeforeSuite@AfterSuite

你的问题几乎是jUnit 4.x中Before和After Suite执行钩子的dup,所以我会看看那里的建议。