Ответ 1
JUnit 4.11 теперь поддерживает указание порядка выполнения с помощью @FixMethodOrder
аннотация.
Я использую JUnit4.
У меня есть набор тестовых методов в тестовом примере.
Каждый тестовый метод вставляет некоторые записи и проверяет результат теста и, наконец, удаляет введенные записи.
Так как JUnit работает параллельно, методы тестирования терпят неудачу из-за некоторых записи, присутствующие во время выполнения предыдущего тестового метода. Эта происходит только в моей машине-коллеге (Windows 7), а не в моей машине (Cent OS 6).
Нам нужно, чтобы тестовые методы проходили на всех наших машинах.
Я попытался очистить записи в методе Setup(), но снова работает только на моей машине. Есть ли в JUnit возможность использовать методы тестирования в едином последовательном порядке?
Спасибо,
JUnit 4.11 теперь поддерживает указание порядка выполнения с помощью @FixMethodOrder
аннотация.
MethodSorters - новый класс, представленный после выпуска Junit 4.6. Этот класс объявил три типа порядка выполнения, которые могут использоваться в ваших тестовых случаях при их выполнении.
NAME_ASCENDING (MethodSorters.NAME_ASCENDING). Сортирует методы тестирования. по имени метода, в лексикографическом порядке.
JVM (null). Оставляет методы тестирования в порядке, возвращаемом JVM. Обратите внимание, что порядок от JVM my варьируется от run to run.
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/
Заказ JUnit не гарантируется.
Причиной этого является то, что модульные тесты должны быть атомарными - все настройки должны происходить в методах установки/срыва, но не в других тестах.
Рассмотрите возможность перемещения кода, который вставляет данные в другой вспомогательный класс, который может быть вызван как тестом, который вставляет, так и классом, который должен проверять, и вызовом этого класса в ваших методах @Before.
Вы также должны рассмотреть насмешливое решение (например, Mockito), а не попадание в базу данных напрямую, если вы можете - насмехаться, - это долгий путь к тому, чтобы ваши тесты были приятными и изолированными, и, как приятное побочное преимущество, обычно укажите, где вы можете использовать некоторые рефакторинги.
Поскольку вы запускаете тесты параллельно, и вы попадаете в базу данных, вы, вероятно, будете иметь проблемы, потому что база данных не обязательно будет в согласованном состоянии для каждого теста.
Решение: не запускайте свои тесты параллельно. JUnit не запускает тесты параллельно по умолчанию, поэтому либо вы устанавливаете параметр в maven, либо используете один из параллельных участников в JUnit.
Если у вас по-прежнему возникают проблемы между неудачами тестов в Windows, но не в Cent OS, возможно, это проблема с порядком выполнения, который вам нужно исправить. См. Мой ответ на Помог ли JUnit4 поддерживать заказ теста? Преднамеренно?.
Способ вокруг (по крайней мере, в терминах JUnit) заключается в удалении зависимостей между тестами. В принципе, JUnit не поддерживает заказы, и тесты должны быть запущены в любом порядке.
Если вам действительно нужны зависимости между тестами, используйте TestNG, где вы можете иметь зависимости.
Нет проблем с запуском тестов параллельно, даже если в нем есть свой уровень данных. Но вам нужно иметь дополнительную работу для создания MOCK UP для ваших данных, чтобы он не попадал в базу данных. Вы можете использовать различные структуры макета, такие как Mockito, EasyMock и Arquillian.