在一组测试用例之前仅加载一次配置

时间:2011-12-08 10:47:02

标签: java junit

我有一个包含所有测试用例类的java包。每个类都包含很多测试用例。每个类都由JUnit逐个加载和运行。但是,每个类都包含通用配置代码,该代码一次又一次地运行,并在每次运行每个类时进行初始化。 这些初始化需要花费很多时间。

是否有某种方法可以先加载这些配置更改,然后运行测试用例,这样我就不需要每次都加载它们。

4 个答案:

答案 0 :(得分:2)

JUnit4有@BeforeClass注释。 做这样的事情:

public class TestClass {

  private static SomeConnection connection;

  @BeforeClass
  public static void setUp() {
    //do common setup
    connection = new SomeConnection();
  }

  @Test
  public void testSomething() { }

  @Test
  public void testSomethingElse() { }

  @AfterClass
  public static void tearDown() {
    //do teardown operations
    connection.close();
  }

}

标有@BeforeClass的方法只会运行一次。只需确保使用JUnit4。

<强>更新
另请注意,它应该是静态,并且正如@ChristopheRoussy所提到的,您可以使用@AfterClass来破坏您的常用设置。

答案 1 :(得分:2)

您可以创建在运行类中的测试之前运行的static方法。

@BeforeClass
public static void ranOnlyOnce() {
     /*...*/
}

此外,如果您想在所有测试之前运行一次,那么您应该将测试分组到一个套件中,并将此方法放在此类中,并使用JUnit运行套件而不是测试。

@RunWith(Suite.class)
@SuiteClasses(value = { Test1.class, ... , Testn.class })
public class AllTests {
    @BeforeClass
    public static void beforeAllTests() {
         /*...*/
    }
}

请注意,注释只能在Junit 4 +中使用。

答案 2 :(得分:1)

我建议将您的测试分组到测试套件并从测试套件进行初始化。这里有可能讨论的可能性http://www.xoriant.com/blog/software-testing-and-qa/using-customized-junit-testsuite-for-testing.html

答案 3 :(得分:0)

有很多种可能性。第一个也是最简单的是使用Matyas和jFrenetic建议的@BeforeClass@AfterClass。如果没有测试类共享设置代码,这是最简单的方法。

如果类共享相同的设置和拆卸,请查看使用TestRule,特别是ExternalResource,它允许您在每个类之前和之后运行代码。这与@BeforeClass@AfterClass之间的区别在于它使用相同的类,因此可以更轻松地共享代码。这可以做到例如:

@RunWith(Suite.class)
@SuiteClasses({A.class, B.class, C.class})
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();
        };
    };
}

这也适用于测试类,因此您可以为不同的类设置不同但共享的设置。