Получение названия текущего теста в JUnit 4: руководство
Быстрый ответ
Для того чтобы узнать имя текущего теста в JUnit 4, необходимо воспользоваться вспомогательным классом TestName:
@Rule
public TestName testName = new TestName();
@Test
public void exampleTest() {
    String currentTestName = testName.getMethodName();
    // Теперь у вас есть имя текущего теста!
}
При вызове метода testName.getMethodName() внутри теста будет возвращено его имя.

Эффективное логирование и управление данными при помощи правил JUnit 4
В процессе модульного тестирования с JUnit 4 особое внимание стоит обратить на использование встроенных правил, в частности TestName. Данное правило значительно облегчает тест-конкретные операции, например логирование и предварительную загрузку данных, предоставляя доступ к имени текущего теста.
Логирование с помощью SLF4J
Следующий код позволяет установить индивидуальное логирование, интегрируя SLF4J в JUnit 4:
private static final Logger logger = LoggerFactory.getLogger(MyTestClass.class);
@Rule
public TestName testName = new TestName();
@Before
public void logTestName() {
    logger.info("Тест начинается: {}", testName.getMethodName());
}
Таким образом, перед каждым тестом его имя будет автоматически записываться в логи. Это значительно облегчает анализ результатов при параллельном выполнении нескольких тестов.
Оптимизация работы с тестовыми данными
С привязкой имени тестового метода к названиям файлов ресурсов можно автоматизировать загрузку данных, специфичных для каждого теста:
@Test
public void exampleTest() {
    String currentTestName = testName.getMethodName();
    InputStream testDataStream = getClass().getResourceAsStream(currentTestName + ".data");
    // Здесь ваши тестовые данные в виде потока байтов!
}
Такой подход упрощает поддержку и масштабирование тестов, даже в больших проектах.
Визуализация
Считайте каждый тест как готовящегося к забегу бегуна:
🏁🏃💨 – Тест 1 готовится к старту
🏃📛 – Время зафиксировано: "Тест 1!"
🏁🏃💨 – Тест 2 на старте
🏃📛 – Отметим время: "Тест 2!"
Каждому тесту присваивается уникальный идентификатор, по аналогии с номером бегуна.
@Before
public void printTestName(Method testMethod) {
    System.out.println("Ожидает своей очереди: " + testMethod.getName());
    // Приготовление к тесту!
}
Таким образом, вспомогательный метод фиксирует имя теста перед его стартом.
Решение проблемы конфликта имён методов
При использовании TestName в тестах, которые расширяют TestCase, необходимо быть осторожным, так как из-за устаревшей архитектуры правило может не действовать. В таком случае рекомендуется использовать альтернативные подходы, например Description, или перейти на новую структуру тестов.
Продвинутое использование TestWatcher для дополнительного контроля
С версии JUnit 4.9 появился класс TestWatcher, позволяющий выполнять более сложные операции:
@Rule
public TestWatcher watchman = new TestWatcher() {
    @Override
    protected void starting(Description description) {
        logger.info("Тест начинается: {}", description.getMethodName());
    }
};
@Test
public void exampleTest() {
    // Проверим состояние перед стартом...
}
Метод starting вызывается перед каждым тестом, что дает возможность выполнения предварительных действий.
Переход на JUnit 5
Если вы собираетесь перевести проект на JUnit 5, вам пригодится возможность инъекции TestInfo для удобного доступа к метаданным тестов:
@Test
public void exampleTest(TestInfo testInfo) {
    System.out.println("Отображаемое имя: " + testInfo.getDisplayName());
    // Так кто я? Да, это мой тест!
}
Не забудьте ознакомиться с руководством пользователя JUnit 5 и Javadoc для TestInfo, чтобы получить полное представление о его возможностях.
Полезные материалы
- JUnit 4 API Javadoc для класса Description
- Получение имени текущего теста в JUnit 4 – Stack Overflow
- JUnit 4 API Javadoc для правила TestName
- Tutorial по Reflection API (The Java™ Tutorials)
- Method (Java Platform SE 8)
- GitHub – junit-team/junit4: Нацеленный на разработчиков фреймворк для тестирования на Java


