2014-01-07 5 views
1

В JUnit 3, я мог бы получить все тесты в набор тестов с помощью следующего кода:Как получить набор тестов в наборе тестов JUnit 4

TestSuite allTestsSuite = (TestSuite) AllTests.suite() 
Enumeration enumeration = allTestsSuite.tests(); 
ArrayList listOfTests = Collection.list(enumeration); 

Однако, я не могу найти эквивалентный способ сделать это в JUnit 4. У классов больше нет метода .suite(); они просто используют аннотацию @Suite. Это не было бы проблемой, кроме того, что Suite class больше не имеет метода tests(). Существует метод children(), но это возвращает список Runners, который кажется чем-то другим, чем то, что я ищу.

Так как я могу получить тесты внутри набора тестов в JUnit 4, как я мог бы с JUnit 3?

+0

Возможно, вы можете [отсканировать аннотированную классность] [1]. [1]: http://stackoverflow.com/questions/4107498/how-to-build-a-list-of-classes-annotated-with-my-custom-annotation – aalku

+0

Почему вы хотите тесты? Существуют различные решения для разных вариантов использования. Различные участники могут также динамически генерировать новые тесты, поэтому было бы сложно получить полный список тестов Junit 4, пока вы их не запустили. – dkatzel

+0

@Dkatzel Я работаю над некоторым устаревшим кодом, который анализирует состав пакета JUnit и проверяет, что правильные тесты находятся в правильном наборе (например,убедитесь, что кто-то не поместил тест GUI в набор базы данных). Возможно, это излишне педантично, но, к сожалению, сейчас у меня нет никаких прав на это, поэтому я пытаюсь найти эквивалент JUnit 4 для существующего кода. – Thunderforge

ответ

1

После недолгих экспериментов я обнаружил следующее решение:

SuiteClasses suiteClassesAnnotation = AllTests.class.getAnnotation(SuiteClasses.class); 
if (suiteClassesAnnotation == null) 
    throw new NullPointerException("This class isn't annotated with @SuiteClasses"); 
Class<?>[] classesInSuite = suiteClassesAnnotation.value(); 

В основном, он получает классы так же, как сама JUnit получает их: глядя в аннотации и определяя, какие значения включены в Это.

Решение категории, предоставляемое dkatzel, также является хорошим вариантом, если вы в конечном счете хотите отфильтровать эти классы, но если вам нужен список классов в наборе для других целей, таких как анализ кода, это самый простой и самый прямой способ сделать это.

0

Самый простой способ выполнить любой тип фильтрации - создать свой собственный JUnit Categories.

Смотреть это Junit Category tutorial для получения более подробной информации, но в основном, создавать свои собственные категории с именем все, что вы хотите

public interface GuiTest{ } 

public interface DbTest { } 

И теперь вы можете аннотировать либо целые классы тестов или отдельные тесты с этой категорией:

@Category(GuiTest.class) 
public void myJPanelTest{ 


    @Test 
    public void testFoo(){ 
     ... 
    } 

    //look we can have other categories too 
    @Test 
    @Category(DbTest.class) 
    public void accidentalDbTest(){ 

    } 
} 

Затем в вашем тестовом наборе вы можете указать, включать или исключать тесты, соответствующие данной категории

@RunWith(Categories.class) 
@IncludeCategory(GuiTest.class) 
@ExcludeCategory(DbTest.class) //not sure if we need both but can't hurt 
@SuiteClasses({ 
    ... 
}) 
public class GuiTestsOnlySuite{} 

Использование категорий намного лучше, чем при необходимости проводить тесты фильтрации вручную на основе условных соглашений об именах, поскольку это трудно запоминать (и чтобы все члены вашей группы придерживались соглашений об именах), и поскольку категории - это классы, вы можете использовать свою IDE для поиска/рефакторинга/времени компиляции, проверяя имена вашей категории.

Единственный недостаток, который я видел, по крайней мере, в моей среде IDE, тесты занимают немного больше времени, потому что есть лишняя работа над отражением, чтобы убедиться, что тест соответствует критериям фильтра вашей категории до его запуска.

Смежные вопросы