Получить имя выполняемого в данный момент теста в JUnit 4 - PullRequest
222 голосов
/ 23 января 2009

В JUnit 3 я мог получить имя запущенного в данный момент теста, например:

public class MyTest extends TestCase
{
    public void testSomething()
    {
        System.out.println("Current test is " + getName());
        ...
    }
}

, который вывел бы «Текущий тест - это testSomething».

Есть ли какой-либо из готовых или простых способов сделать это в JUnit 4?

Справочная информация. Очевидно, я не хочу просто печатать название теста. Я хочу загрузить специфичные для теста данные, которые хранятся в ресурсе с тем же именем, что и тест. Вы знаете, соглашение о конфигурации и все такое.

Ответы [ 13 ]

0 голосов
/ 12 августа 2018

В JUnit 5 TestInfo выступает в качестве замены для правила TestName из JUnit 4.

Из документации:

TestInfo используется для ввода информации о текущем тесте или контейнер в @Test, @RepeatedTest, @ParameterizedTest, @TestFactory, @BeforeEach, @AfterEach, @BeforeAll и @AfterAll методы.

Чтобы получить имя метода текущего выполненного теста, у вас есть две опции: String TestInfo.getDisplayName() и Method TestInfo.getTestMethod().

Для извлечения только имени текущего метода тестирования TestInfo.getDisplayName() может быть недостаточно, поскольку отображаемое имя метода тестирования по умолчанию - methodName(TypeArg1, TypeArg2, ... TypeArg3).
Дублирование имен методов в @DisplayName("..") не является хорошей идеей.

В качестве альтернативы вы можете использовать TestInfo.getTestMethod(), который возвращает Optional<Method> объект.
Если метод извлечения используется внутри тестового метода, вам даже не нужно проверять Optional упакованное значение.

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.TestInfo;
import org.junit.jupiter.api.Test;

@Test
void doThat(TestInfo testInfo) throws Exception {
    Assertions.assertEquals("doThat(TestInfo)",testInfo.getDisplayName());
    Assertions.assertEquals("doThat",testInfo.getTestMethod().get().getName());
}
0 голосов
/ 14 апреля 2015

Вы можете достичь этого, используя Slf4j и TestWatcher

private static Logger _log = LoggerFactory.getLogger(SampleTest.class.getName());

@Rule
public TestWatcher watchman = new TestWatcher() {
    @Override
    public void starting(final Description method) {
        _log.info("being run..." + method.getMethodName());
    }
};
0 голосов
/ 25 января 2009

Я бы посоветовал вам отделить название метода тестирования от набора тестовых данных. Я бы смоделировал класс DataLoaderFactory, который загружает / кэширует наборы тестовых данных из ваших ресурсов, а затем в вашем тестовом примере cam вызывает некоторый интерфейсный метод, который возвращает набор тестовых данных для тестового примера. Привязка тестовых данных к имени метода теста предполагает, что тестовые данные могут использоваться только один раз, тогда как в большинстве случаев я бы рекомендовал использовать одни и те же тестовые данные в нескольких тестах для проверки различных аспектов вашей бизнес-логики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...