JUnit: как фильтровать тесты, найденные в нескольких наборах

#java #junit #junit4

#java #junit #junit4

Вопрос:

Когда JUnit запускает набор тестов, содержащий несколько «вспомогательных наборов», возможно ли фильтровать тесты, найденные в разных наборах, чтобы заставить их запускаться только один раз? Я работаю над проектом со многими тестами интеграции с базой данных, поэтому желательно запускать их только один раз, чтобы ускорить процесс.

Рассмотрим этот «основной набор»:

 @RunWith(Suite.class)
@SuiteClasses
({
    ModuleASuite.class,
    ModuleBSuite.class,
    // More suites...
})
public class MainSuite
{}
  

И эти «вспомогательные наборы»:

 @RunWith(Suite.class)
@SuiteClasses
({
    TestA1.class,
    TestA2.class,
    //... More tests only related to ModuleA

    SomeTestUsedByManyModules.class
})
public class ModuleASuite
{}

@RunWith(Suite.class)
@SuiteClasses
({
    TestB1.class,
    TestB2.class,
    //... More tests only related to ModuleB

    SomeTestUsedByManyModules.class
})
public class ModuleBSuite
{}
  

В настоящее время при запуске MainSuite с использованием JUnit 4.4 (с использованием Eclipse или Ant) он выполняется SomeTestUsedByManyModules дважды. Как я могу заставить его запускаться только один раз? Я думал о создании своего собственного раннера, но, может быть, для этого есть более простое решение?

Комментарии:

1. Я никогда не слышал, чтобы JUnit отслеживал, запускал ли он тестовый метод раньше — в конце концов, может быть, это то, что вы намеревались? Вероятно, единственный способ — написать свой собственный runner. (Ну, вы могли бы добавить код к каждому методу тестирования, чтобы зарегистрировать себя в некотором общем хэше, чтобы он мог решать, запускать или нет. Довольно некрасиво.) Написание тестовых программ, по общему признанию, выглядит устрашающе, но это выглядит намного сложнее, чем есть на самом деле.

Ответ №1:

Я не знаю, как это сделать с помощью @RunWith (Suite), но как насчет другого подхода? ClasspathSuite позволяет вам предоставлять шаблоны имен тестов, чтобы избежать необходимости перечислять их все вручную.