Как вы создаете вложенные TestSuites в JUnit 4.x? - PullRequest
5 голосов
/ 31 января 2012

Я пытаюсь добавить JUnit в большой проект, и у меня возникают трудности с вложением наборов тестов.Например:

@RunWith(Suite.class)
@Suite.SuiteClasses({Test2.class, .....})
public class Test1{
}

@RunWith(Suite.class)
@Suite.SuiteClasses({Test3.class, .....})
public class Test2{
  //might have tests
}

@RunWith(Suite.class)
public class Test3{
  //tests here
}

Каждый класс выполняет тесты в своем собственном пакете, а также во всех подпакетах TestSuites

Запуск Test1 приводит к java.lang.Exception: Нетзапускаемые методы .Как мне заставить это работать?Есть ли лучший способ организовать тесты без огромного списка где-нибудь?

Ответы [ 2 ]

6 голосов
/ 08 января 2014

Первая проблема заключается в том, что Test3 использует @RunWith(Suite.class), но не содержит @Suite.SuiteClasses({Test3.class, .....}).Это производит IntializationError: class 'Test3' must have a SuiteClasses annotation.Поскольку вы не собираетесь создавать какие-либо классы под Test3, эту аннотацию следует удалить.

Вторая проблема Exception: No runnable methods почти всегда заключается в том, что вы забыли добавить @Test в тест.Вы не поместили тесты в свой образец, поэтому я не знаю, так ли это на самом деле или нет, но это наиболее вероятная причина.

Ниже приводится рабочая версия вашего кода, которая позволяет тестироватьдля запуска из любого класса:

Test1.java

import org.junit.runner.*;
import org.junit.runners.*;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({Test2.class})
public class Test1 {

}

Test2.java

import org.junit.runner.*;
import org.junit.runners.*;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({Test3.class})
public class Test2 {

}

Test3.java

import static org.junit.Assert.*;

import org.junit.*;

public class Test3 {

    @Test
    public void testTrue(){
        assertTrue(true);
    }
}

Что касается того, есть ли лучший способ, чем организовать вещи, я думаю, это зависит только от того, как вы решите создать классы.Поскольку вы можете добавлять комплекты к наборам, как это показано, вы можете создавать меньшие куски комплектов, которые зависят от всего, например, от дерева.Например, то, что я обычно делаю, это:

AllTestSuite
    TextParsingSuite
    GuiSuite
        SwingSuite
        JavaFXSuite
    FileIOSuite

Тест добавлен в наиболее подходящий пакет.В конце концов, я не думаю, что у меня есть какой-либо набор с более чем 10 тестовыми классами / пакетами или около того.Если я это сделаю, пришло время сделать новый суб-пакет.Другими словами, где-то нет «огромного списка», просто множество небольших списков, которые объединены в другой список для эффективного создания одного большого списка.

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

0 голосов
/ 31 января 2012

Лично я использую maven / ant / Eclipse для запуска наборов тестов.

Если вы используете maven, посмотрите на surefire .Чтобы запустить все тесты junit для модуля, добавьте в pom следующее:

<build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.11</version>
        </plugin>
      </plugins>
    </pluginManagement>
</build>

Для Ant посмотрите задачу JUnit :

<junit printsummary="yes" haltonfailure="yes">
  <classpath>
    <pathelement location="${build.tests}"/>
    <pathelement path="${java.class.path}"/>
  </classpath>

  <formatter type="plain"/>

  <test name="my.test.TestCase" haltonfailure="no" outfile="result">
    <formatter type="xml"/>
  </test>

  <batchtest fork="yes" todir="${reports.tests}">
    <fileset dir="${src.tests}">
      <include name="**/*Test*.java"/>
      <exclude name="**/AllTests.java"/>
    </fileset>
  </batchtest>
</junit>

ДляEclipse, щелкните правой кнопкой мыши по пакету и выберите «Запуск от имени JUnit».Это запустит все тесты, которые можно найти в этих пакетах.В Intellij будет аналогичный функционал.

...