Как я могу указать зависимости теста JUnit?

Наш инструментарий имеет более 15000 тестов JUnit , и многие тесты, как известно, терпят неудачу, если какой-либо другой тест выходит из строя. Например, если метод X.foo () использует функциональные возможности из Y.bar () и YTest.testBar (), то XTest.testFoo () не будет работать. Очевидно, что XTest.testFoo () также может завершиться ошибкой из-за проблем, специфичных для X.foo ().

Хотя это нормально, и я все же хочу, чтобы оба теста выполнялись, было бы неплохо, если бы можно было аннотировать зависимость теста от XTest.testFoo (), указывающую на YTest.testBar (). Таким образом, можно сразу увидеть, какая функциональность, используемая X.foo (), также терпит неудачу, а что нет.

Имеется ли такая аннотация в JUnit или в другом месте? Что-то вроде:

public XTest { @Test @DependsOn(method=org.example.tests.YTest#testBar) public void testFoo() { // Assert.something(); } } 

JExample и TestNG имеют что-то подобное.

Я не знаю, насколько это полезно, но если вы попробуете, пожалуйста, вернитесь, чтобы рассказать нам, полезно ли это.

В JUnit есть вклад, который касается этого: https://github.com/junit-team/junit.contrib/tree/master/assumes

org.junit.FixMethodOrder

@FixMethodOrder (MethodSorters.NAME_ASCENDING) Это относится к classу тестов Unit.

Вы можете назвать свои методы public void step1_methodName и т. Д.

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

В управляемой поведением библиотеке дизайна jBehave есть ключевое слово GivenScenarios которое импортирует список сценариев, которые запускаются до основного сценария. Это дает возможность определять зависимости и иметь одну точку отказа. Журналирование jBehave сообщит вам, если тест не выполняется в зависимости или разделе основного тела.

На самом деле это не так, что я знаю. (Edit: вы узнаете что-то новое каждый день :)) По-моему, это не так уж плохо, хотя я вижу, что это полезно, особенно когда JUnit используется для других форм автоматических тестов – например, интеграция тесты). Ваши тесты, IMO, не в строгом смысле слова «модульные тесты» (по крайней мере, не для теста X#foo() ). Тесты для X#foo() должны быть успешными или неудачными в зависимости от реализации X#foo() . Он не должен зависеть от Y#foo() .

То, что я сделал бы в вашей позиции, – это издеваться над Y и реализовать что-то вроде MockY#foo() с очень простым управляемым поведением и использовать его в тестах X#foo() .

Тем не менее, с 15 000 тестов, я вижу, как это будет болью для рефакторинга. 🙂