jUnit: общий тестовый класс - установка имени теста на что-то другое, чем имя класса/метода?

У меня есть набор тестов проекта с набором файлов, которые я хочу использовать в качестве набора тестов - один тест на файл.

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

Сеть JBoss Operation Network использовала TestNG, который позволял создавать набор тестов и наполнять его несколькими экземплярами одного и того же класса, а также позволял явно задавать имя теста.

В jUnit я не нашел способа изменить имя теста. Так было бы всем одинаково.

Есть ли какой-либо способ или расширение для многократного запуска одного и того же класса с произвольным результирующим именем теста?

PS: я бы предпочел не прибегать к инструментам класса.


person Ondra Žižka    schedule 18.10.2012    source источник


Ответы (2)


Когда вы создаете TestSuite, вы можете передать desiredTestCaseName в качестве аргумента конструктора:

public class AllTestSuite extends TestSuite{

  public static Test suite() {
      TestSuite suite= new TestSuite();
      Test testCase1 = new MyTest("TestCaseOne");
      Test testCase2 = new MyTest("TestCaseTwo");
      suite.addTest(testCase1);
      suite.addTest(testCase2);
      return suite;
  }
}

Когда вы запускаете пакет, он будет ссылаться на имена, предоставленные в конструкторе, т.е. TestCaseOne и TestCaseTwo, а тестовый класс - MyTest.

ИЗМЕНИТЬ:

Пожалуйста, убедитесь, что вы определили конструктор в классе MyTest как:

public MyTest(String name) {
    super(name);
}

Если требуется поддержка дополнительных параметров, вы можете добавить конструктор в тестовый пример, чтобы принимать параметры и назначать их переменным класса тестового случая (изначально установленным по умолчанию со значениями тестового сценария по умолчанию), которые можно использовать во время выполнения теста:

public MyTest(String name, String param1, Integer param2...) {
    super(name);
    this.param1 = param1;
    this.param2 = param2;
}

После запуска набора тестов консоль JUnit выглядит так, как показано ниже: введите здесь описание изображения

person Yogendra Singh    schedule 18.10.2012
comment
Я не уверен, как это сделать с помощью параметра конструктора моего класса. Документы есть? - person Ondra Žižka; 18.10.2012
comment
Ах, я должен добавить объекты TestSuite в корневой TestSuite, верно? - person Ondra Žižka; 18.10.2012
comment
Попробуйте и проверьте список JUnit Runner: Test Case. - person Yogendra Singh; 18.10.2012
comment
Да. Я обновил ответ полным образцом кода. Если вы считаете, что это полезно, не забудьте принять ответ. - person Yogendra Singh; 18.10.2012
comment
Не работает. MyTest(foo), как я и ожидал, просто игнорирует параметр, и JUnit не переименовывается волшебным образом. Кроме того, единственным способом запустить набор тестов, который я нашел, было использование @Suite, в котором есть только SuiteClasses({...}). Можете ли вы указать мне какой-нибудь рабочий пример? - person Ondra Žižka; 18.10.2012
comment
Я добавляю некоторые подробности в ответ. Пожалуйста, дайте мне знать, если вы ищете что-то еще? - person Yogendra Singh; 18.10.2012
comment
Хорошо, мне потребовалось некоторое время, так как у набора тестов были некоторые проблемы с дизайном (например, инициализация в static {...} и т. Д., Но, наконец, я заставил его работать. Спасибо. - person Ondra Žižka; 22.10.2012

Если вы используете JUnit4, вы можете посмотреть на @Parameterized . Основная идея заключается в том, что вы предоставляете список того, что нужно сделать, а JUnit выполняет один и тот же метод тестирования для каждого элемента в списке.

В версии 4.10 имена не слишком хороши, вы получаете 0, 1, 2... в качестве имен, но с 4.11-бета-1 (которая скоро должна выйти из бета-версии) вы можете получить лучшую схему именования, потому что вы можете указать имя. См. javadoc в верхней части @параметризованный.

@RunWith(Parameterized.class)
public class FibonacciTest {
    @Parameters(name= "{index}: fib({0})={1}") // we specify the name here
    public static Iterable<Object[]> data() {
        return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },
                { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });
    }

    private int fInput;

    private int fExpected;

    public FibonacciTest(int input, int expected) {
        fInput= input;
        fExpected= expected;
    }

    @Test
    public void test() {
        assertEquals(fExpected, Fibonacci.compute(fInput));
    }
}

В приведенном выше вы получите такие имена, как

fib(0)=0
fib(1)=1
fib(2)=1

и т.п.

person Matthew Farwell    schedule 18.10.2012
comment
Параметризованный — это хорошо, но метод должен быть статическим. Я намеревался сделать этот класс расширяемым, так как существует несколько наборов файлов с немного разными настройками для проекта, и у меня будет класс для каждого. Это возможно как-то? - person Ondra Žižka; 18.10.2012