Как заставить тестовые случаи JUnit работать в последовательном порядке? - PullRequest
18 голосов
/ 12 марта 2012

Я использую JUnit4.

У меня есть набор методов теста в тестовом примере.

Каждый метод теста вставляет несколько записей и проверяет результат теста и, наконец, удаляет вставленные записи.

Поскольку JUnit работает параллельно, методы тестирования не выполняются из-за наличия некоторых записей во время выполнения предыдущего метода тестирования.Это происходит только на моем коллегном компьютере (Windows 7), а не на моем компьютере (Cent OS 6).

Нам нужно, чтобы методы тестирования проходили на всех наших машинах.

Я попытался очистить записи в методе Setup (), но опять-таки он работает только на моем компьютере.Есть ли в JUnit какая-либо опция, позволяющая запускать методы тестирования в едином последовательном порядке?

Спасибо,

Ответы [ 5 ]

26 голосов
/ 17 декабря 2012

JUnit 4.11 теперь поддерживает указание порядка выполнения с помощью аннотации @FixMethodOrder.

24 голосов
/ 19 июня 2014

MethodSorters - новый класс, представленный после выпуска Junit 4.6.Этот класс объявил три типа порядка выполнения, которые можно использовать в ваших тестовых примерах при их выполнении.

  1. NAME_ASCENDING (MethodSorters.NAME_ASCENDING) - сортирует методы тестапо имени метода в лексикографическом порядке.

  2. JVM (null) - Оставляет методы тестирования в порядке, возвращенном JVM.Обратите внимание, что порядок от JVM может варьироваться от запуска к запуску.

  3. DEFAULT (MethodSorter.DEFAULT) - сортирует методы тестирования в детерминированном, но не предсказуемом порядке.

.

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

//Running test cases in order of method names in ascending order

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class OrderedTestCasesExecution {

    @Test
    public void secondTest() {
        System.out.println("Executing second test");
    }

    @Test
    public void firstTest() {
        System.out.println("Executing first test");
    }

    @Test
    public void thirdTest() {
        System.out.println("Executing third test");
    }
}

Вывод:

Executing first test
Executing second test
Executing third test

Ссылка: http://howtodoinjava.com/2012/11/24/ordered-testcases-execution-in-junit-4/

8 голосов
/ 12 марта 2012

Заказ тестов не гарантируется в JUnit.

Причина этого заключается в том, что модульные тесты должны быть атомарными - все настройки должны выполняться в методах установки / разрыва, но не другимиtests.

Рассмотрите возможность перемещения кода, который вставляет данные, в другой вспомогательный класс, который может быть вызван как вставляющим тестом, так и классом, который необходимо проверить, и вызовом этого класса в ваших методах @Before.

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

2 голосов
/ 14 марта 2012

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

Решение: не запускайте тесты параллельно. JUnit по умолчанию не запускает тесты параллельно, поэтому вы устанавливаете опцию в maven или используете один из параллельных бегунов в JUnit.

Если у вас по-прежнему возникают проблемы между неудачными тестами в Windows, но не в Cent OS, возможно, это проблема с порядком выполнения, которую вам необходимо исправить. См. Мой ответ на JUnit4 начал поддерживать порядок тестирования? Это намеренно? .

Способ обойти это (по крайней мере, в терминах JUnit) - удалить зависимости между тестами. По сути, JUnit не поддерживает порядок, и тесты можно запускать в любом порядке.

Если вам действительно нужны зависимости между тестами, используйте TestNG, где вы можете иметь зависимости.

0 голосов
/ 23 июня 2015

Нет проблем при параллельном выполнении тестов, даже если у вас есть слой данных в нем. Но вам нужно проделать дополнительную работу по созданию MOCK UP для ваших данных, чтобы они не попали в базу данных. Вы можете использовать разные макетные среды, такие как Mockito, EasyMock и Arquillian.

...