Сбор метаданных теста JUnit с помощью аннотаций

Есть ли класс/метод, который я мог бы реализовать в JUnit, который в основном представляет собой ловушку, которая запускается после завершения каждого тестового примера с доступными метаданными, определенными пользователем (в коде)?

Я пытаюсь выполнить что-то вроде этого:

  • Аннотируйте тестовый пример пользовательской аннотацией, такой как принадлежность команды (например, @Team(Teams.PAYMENTS))
  • Вывести на консоль результат теста с тремя значениями: имя теста (имя тестовой функции), статус (пройдено/не пройдено) и команда (значение аннотации).

Для простоты мне просто нужно распечатать эту информацию (позже она будет опубликована в другом месте), но я действительно теряюсь в том, где я мог бы получить эту информацию о метаданных теста в одном месте после запуска теста?

Я попытался переопределить метод завершения в одном из наших классов TestRunner:

    override fun finish(resultCode: Int, results: Bundle?) {
        System.out.println("===breakpoint here===")

        super.finish(resultCode, results)
    }

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

Спасибо!


person Dragan R.    schedule 20.04.2021    source источник


Ответы (1)


Для JUnit 4 вы можете использовать правило TestWatcher. :

import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;

public class TestWatcherAPIUnitTest {

    @Rule(order = Integer.MIN_VALUE)
    public TestWatcher watchman = new TestWatcher() {
        @Override
        protected void failed(Throwable e, Description description) {
            System.out.println(description + " Team: " + getTeam(description) + " failed!");
        }

        @Override
        protected void succeeded(Description description) {
            System.out.println(description + " Team: " + getTeam(description) + " success!");
        }

        String getTeam(Description description) {
            Team team = description.getAnnotation(Team.class);
            return (team != null) ? team.value() : "unknown_team";
        }


    };

    @Test
    @Team("team1")
    public void failing_test() {
        Assert.assertTrue(false);
    }

    @Test
    @Team("team2")
    public void successful_test() {
        Assert.assertTrue(true);
    }
}

Точно так же для JUnit5 существует TestWatcher API.

person Lesiak    schedule 21.04.2021
comment
Это действительно приятно, спасибо, @Lesiak! Похоже, что областью действия этого правила является только этот конкретный класс — есть ли способ применить правило к любому тестовому набору, который проходит через конкретный Test Runner? - person Dragan R.; 21.04.2021
comment
По-видимому, это можно сделать с подклассом бегуна, чтобы включить правило (хотя я этого не пробовал). Обратите внимание, что вышеприведенное правило может быть определено в отдельном классе, что более приемлемо, чем определение его на месте каждый раз. См. stackoverflow.com/questions/7639353/ - person Lesiak; 21.04.2021
comment
Я попытаюсь объединить оба ответа и попробую этот подход. Спасибо @Lesiak за помощь! - person Dragan R.; 21.04.2021