Запуск тестов JUnit Юпитера из основного метода? - PullRequest
0 голосов
/ 01 мая 2018

У меня есть класс Java с методом main, который я вызываю для периодического запуска некоторых тестов. В частности, я пытаюсь найти решение для быстрого тестирования различных фрагментов кода, которые используют AWS SDK для создания / чтения некоторых объектов S3. Я на самом деле не пытаюсь создавать регулярные модульные / интеграционные тесты, и мне не интересно издеваться над кодом S3. Я пытаюсь быстро разработать / отладить некоторый код, используя тестовую среду. Я нашел следующий вопрос и ответ об использовании JUnit5 Jupiter's Launcher, и он меня заинтриговал: Как запустить тесты JUnit из моего java-приложения? Поэтому я прочитал главу Junit5 по Launcher API и следовал примеру кода. Я придумал что-то вроде этого:

class S3ManualTest {
    public static void main(String[] args) {
        LauncherDiscoveryRequest request =
            LauncherDiscoveryRequestBuilder
                .request()
                .selectors(selectPackage("com.xyz.s3util"),
                           selectClass(S3ManualTest.class),
                           selectMethod(S3ManualTest.class, "happyPath")
                )
                .build();

        Launcher launcher = LauncherFactory.create();
        SummaryGeneratingListener listener = new SummaryGeneratingListener();

        launcher.execute(request, listener);

        TestExecutionSummary summary = listener.getSummary();
        System.out.println("# of containers found: " + summary.getContainersFoundCount());
        System.out.println("# of containers skipped: " + summary.getContainersSkippedCount());
        System.out.println("# of tests found: " + summary.getTestsFoundCount());
        System.out.println("# of tests skipped: " + summary.getTestsSkippedCount());
    }

    void happyPath() {
        assertTrue(true); // Do useful stuff here
    }
}

Средство запуска не находит никаких тестов для запуска, хотя я специально выбрал метод "happyPath". Я попытался аннотировать метод happyPath() с помощью @Test, и это, кажется, работает, но у него также есть нежелательный побочный эффект, который метод выполняется, если я запускаю все тесты в этом пакете, либо из gradle, либо изнутри IDE. По сути, я хочу, чтобы мои тестовые методы вызывались с помощью инфраструктуры JUnit5, но только когда я вручную запускаю основной метод в классе. Я думал о некоторых пользовательских аннотациях или о реализации какого-то интерфейса, который мог бы быть подхвачен тестовым движком, но еще не пошел по этому пути. Я предполагаю, что есть какой-то простой способ выполнить то, что я пытаюсь сделать. Благодарю.

1 Ответ

0 голосов
/ 01 мая 2018

Я мог только найти обходной путь: отключить метод теста happyPath() по умолчанию и переопределить его в вашей программе, как описано здесь: https://junit.org/junit5/docs/current/user-guide/#extensions-conditions-deactivation

@Test
@Disabled
void happyPath() {
    assertTrue(true); // Do useful stuff here
}

И в настройках запуска отключите DisabledCondition:

LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder
            .request()
            .selectors(selectMethod(S3ManualTest.class, "happyPath"))
            .configurationParameter(
                 "junit.jupiter.conditions.deactivate",
                 "org.junit.*DisabledCondition")
            .build();

Вы также можете указать выделенный переключатель, если не хотите деактивировать DisabledCondition для всего прогона:

@Test
@EnabledIf("'true'.equals(junitConfigurationParameter.get('manual'))")
void happyPath() {
    assertTrue(true); // Do useful stuff here
}

с

LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder
        ...
        .configurationParameter("manual", "true")
        .build();

Второй обходной путь, если он применяется более чем к нескольким методам, требует выделенного расширения ExecutionCondition. Подробности см. На https://junit.org/junit5/docs/current/user-guide/#writing-tests-conditional-execution-scripts

...