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

Java 在一组测试用例之前只加载一次配置,java,junit,Java,Junit,我有一个包含所有测试用例类的java包。每个类都包含很多测试用例。JUnit会逐个加载和运行每个类。但是,每个类都包含一次又一次运行并在每次运行每个类时初始化的公共配置代码。 这些初始化需要很多时间 有没有办法先加载这些配置更改,然后运行测试用例,这样我就不必每次都加载它们。JUnit4有@BeforeClass注释。 就这样做吧: public class TestClass { private static SomeConnection connection; @BeforeCl

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


有没有办法先加载这些配置更改,然后运行测试用例,这样我就不必每次都加载它们。

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即可

更新:

还要注意的是,它应该是静态的,正如@ChristopherRoussy所提到的,您可以使用@AfterClass来破坏您的公共设置。

您可以创建一个
静态的方法,该方法在运行类内的测试之前运行

@BeforeClass
public static void ranOnlyOnce() {
     /*...*/
}
此外,如果希望在所有测试之前运行一次,那么应该将测试分组到一个套件中,并将此方法放入此类中,并使用JUnit运行套件而不是测试

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

注意,注释只能在JUnit4+中使用。

我建议将测试分组到一个testsuite中,并从testsuite中进行初始化。这里有一个很好的可能性讨论

有许多可能性。第一种也是最简单的方法是按照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();
        };
    };
}

这也在测试类中工作,所以可以为不同的类设置不同但共享的设置。

也考虑使用@后课。