Вопрос-ответ

How to run test methods in specific order in JUnit4?

Как запускать тестовые методы в определенном порядке в JUnit4?

Я хочу выполнить тестовые методы, которые аннотируются @Test в определенном порядке.

Например:

public class MyTest {
@Test public void test1(){}
@Test public void test2(){}
}

Я хочу убедиться, что они запускаются test1() перед test2() каждым моим запуском MyTest, но я не смог найти аннотацию, подобную @Test(order=xx).

Я думаю, что это довольно важная функция для JUnit, если автор JUnit не хочет функцию упорядочивания, почему?

Переведено автоматически
Ответ 1

Я думаю, что это довольно важная функция для JUnit, если автор JUnit не хочет использовать функцию упорядочивания, почему?


Я не уверен, что есть простой способ сделать это с JUnit, насколько мне известно, JUnit предполагает, что все тесты могут выполняться в произвольном порядке. Из FAQ:


Как мне использовать тестовый инструмент?


(...) Порядок вызовов тестовых методов не гарантируется, поэтому testOneItemCollection() может выполняться перед testEmptyCollection(). (...)


Почему это так? Что ж, я считаю, что делать тесты зависимыми от порядка - это практика, которую авторы не хотят продвигать. Тесты должны быть независимыми, они не должны быть связаны, и нарушение этого усложнит обслуживание, нарушит возможность запускать тесты по отдельности (очевидно) и т.д.

При этом, если вы действительно хотите двигаться в этом направлении, рассмотрите возможность использования TestNG, поскольку он изначально поддерживает запуск тестовых методов в любом произвольном порядке (и такие вещи, как указание того, что методы зависят от групп методов). Седрик Буст объясняет, как это сделать в порядке выполнения тестов в testng.

Ответ 2

Если вы избавитесь от существующего экземпляра Junit и загрузите JUnit 4.11 или более поздней версии по пути сборки, следующий код выполнит тестовые методы в порядке их названий, отсортированных по возрастанию:

import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class SampleTest {

@Test
public void testAcreate() {
System.out.println("first");
}
@Test
public void testBupdate() {
System.out.println("second");
}
@Test
public void testCdelete() {
System.out.println("third");
}
}
Ответ 3

Переход на TestNG кажется лучшим способом, но я не вижу здесь четкого решения для JUnit. Вот наиболее читаемое решение / форматирование, которое я нашел для JUnit:

@FixMethodOrder( MethodSorters.NAME_ASCENDING ) // force name ordering
public class SampleTest {
@Test
void stage1_prepareAndTest(){};

@Test
void stage2_checkSomething(){};

@Test
void stage2_checkSomethingElse(){};

@Test
void stage3_thisDependsOnStage2(){};

@Test
void callTimeDoesntMatter(){}
}

Это гарантирует, что методы stage2 будут вызываться после методов stage1 и перед методами stage3.

P.S. Я считаю, что этот подход лучше, чем JUnit 5.5 @Order annotation, потому что он обеспечивает лучшую нотацию для читателя.

Ответ 4

Если порядок важен, вы должны сделать его самостоятельно.

@Test public void test1() { ... }
@Test public void test2() { test1(); ... }

В частности, вы должны перечислить некоторые или все возможные перестановки порядка для тестирования, если это необходимо.

Например,

void test1(); 
void test2();
void test3();


@Test
public void testOrder1() { test1(); test3(); }

@Test(expected = Exception.class)
public void testOrder2() { test2(); test3(); test1(); }

@Test(expected = NullPointerException.class)
public void testOrder3() { test3(); test1(); test2(); }

Или полный тест всех перестановок:

@Test
public void testAllOrders() {
for (Object[] sample: permute(1, 2, 3)) {
for (Object index: sample) {
switch (((Integer) index).intValue()) {
case 1: test1(); break;
case 2: test2(); break;
case 3: test3(); break;
}
}
}
}

Здесь, permute() это простая функция, которая повторяет все возможные перестановки в коллекции array.

java unit-testing junit