JUnit 4 @BeforeClass & @AfterClass при использовании Suites

При использовании этого подхода ниже, создав jUnit with Suites. У нас возникла проблема, когда все @BeforeClass в каждом Testclass будут выполнены до того, как начнутся какие-либо тесты. (Для каждого файла n TestClass запускается @BeforeClass, после выполнения которого он запускает первые файлы MyTest.class @Test)

Это приведет к тому, что мы выделяем много ресурсов и памяти. Мои мысли заключались в том, что это должно быть неправильно, не каждый запуск @BeforeClass выполняется только до того, как будет выполнен фактический тест-class, а не при запуске Suite?

@RunWith(Suite.class) @Suite.SuiteClasses({ MyTests.class, Mytests2.class, n1, n2, n }) public class AllTests { // empty } public class MyTests { // no extends here @BeforeClass public static void setUpOnce() throws InterruptedException { ... @Test ... public class MyTests2 { // no extends here @BeforeClass public static void setUpOnce() throws InterruptedException { ... @Test ... 

Напишите метод @BeforeClass в classе AllTests, который будет запущен при запуске пакета.

 public class MyTests1 { @BeforeClass public static void beforeClass() { System.out.println("MyTests1.beforeClass"); } @Before public void before() { System.out.println("MyTests1.before"); } @AfterClass public static void afterClass() { System.out.println("MyTests1.AfterClass"); } @After public void after() { System.out.println("MyTests1.after"); } @Test public void test1() { System.out.println("MyTests1.test1"); } @Test public void test2() { System.out.println("MyTests1.test2"); } } public class MyTests2 { @BeforeClass public static void beforeClass() { System.out.println("MyTests2.beforeClass"); } @Before public void before() { System.out.println("MyTests2.before"); } @AfterClass public static void afterClass() { System.out.println("MyTests2.AfterClass"); } @After public void after() { System.out.println("MyTests2.after"); } @Test public void test1() { System.out.println("MyTests2.test1"); } @Test public void test2() { System.out.println("MyTests2.test2"); } } @RunWith(Suite.class) @Suite.SuiteClasses( { MyTests1.class, MyTests2.class }) public class AllTests { @BeforeClass public static void beforeClass() { System.out.println("AllTests.beforeClass"); } @Before public void before() { System.out.println("AllTests.before"); } @AfterClass public static void afterClass() { System.out.println("AllTests.AfterClass"); } @After public void after() { System.out.println("AllTests.after"); } @Test public void test1() { System.out.println("AllTests.test1"); } @Test public void test2() { System.out.println("AllTests.test2"); } } 

ВЫВОД

 AllTests.beforeClass MyTests1.beforeClass MyTests1.before MyTests1.test1 MyTests1.after MyTests1.before MyTests1.test2 MyTests1.after MyTests1.AfterClass MyTests2.beforeClass MyTests2.before MyTests2.test1 MyTests2.after MyTests2.before MyTests2.test2 MyTests2.after MyTests2.AfterClass AllTests.AfterClass 

НТН

Я не слишком хорошо знаком с @RunWith в JUnit, поэтому я, возможно, сделал что-то не так, но я не могу воспроизвести описанное вами поведение. С classом:

 @RunWith(Suite.class) @Suite.SuiteClasses( { FirstTest.class, SecondTest.class, ThirdTest.class }) public class AllTests { // empty } 

И FirstTest.java выглядит так:

 public class FirstTest { @BeforeClass public static void doBeforeClass() { System.out.println("Running @BeforeClass for FirstTest"); } @Test public void doTest() { System.out.println("Running @Test in " + getClass().getName()); } } 

… с SecondTest.java и ThirdTest.java почти одинаково. Я получаю тестовый результат:

 Running @BeforeClass for FirstTest Running @Test in FirstTest Running @BeforeClass for SecondTest Running @Test in SecondTest Running @BeforeClass for ThirdTest Running @Test in ThirdTest 

Это с JUnit 4.5.0 (по умолчанию JUnit в Eclipse 3.5.1) на JDK от Sun 1.6.0_12. Можете ли вы заметить какую-либо разницу в моем примере? Возможно, другой JDK / JVM? Я не знаю достаточно о внутренних подразделениях JUnit, чтобы знать, могут ли они быть фактором.

Я думаю, @BeforeClass выполняется при instanciation.

  • Как запустить все тесты JUnit в категории / комплекте с Ant?
  • Как запустить все тесты, принадлежащие определенной категории в JUnit 4
  • Как проверить, что исключение не выбрасывается?
  • Повторное использование весеннего контекста приложения в тестовых classах junit
  • Как запустить тестовые методы в определенном порядке в JUnit4?
  • Изменение имен параметризованных тестов
  • Указание порядка для junit 4 тестов на уровне метода (не уровне classа)
  • Как работает Junit @Rule?
  • Давайте будем гением компьютера.