Является ли TestReporter от Junit5 потокобезопасным? - PullRequest
1 голос
/ 18 июня 2020

Является ли приведенный ниже фрагмент кода прекрасным, когда два потока могут закончить изменение экземпляра TestReporter одновременно?

    @Test
    public void someTest(TestReporter testReporter) {
        // do some stuff
        CompletableFuture.allOf(
                CompletableFuture.runAsync(() -> {
                    // do task A
                    testReporter.publishEntry("taskA", "valueA");
                }),
                CompletableFuture.runAsync(() -> {
                    // do task B
                    testReporter.publishEntry("taskB", "valueB");
                })
        ).join();
    }

1 Ответ

3 голосов
/ 19 июня 2020

TLDR : Да

Правильный ответ, конечно, зависит от обстоятельств.

JUnit 5 был разработан для обеспечения возможности параллельного выполнения тестов. Весь механизм отчета о результатах тестирования (а также публикация записей отчета) осуществляется посредством распространения событий и не использует ни изменяемое состояние, ни синхронизацию событий или экземпляров базового ReportEntry. Учитывая отсутствие сложных ошибок, testReporter.publishEntry(..) должен быть потокобезопасным.

Вот «НО»: платформа JUnit 5 позволяет сторонним сторонам подключаться к прослушиванию событий, например, для генерации собственных отчетов или выполнения других действий. вещи, когда тесты начинаются, когда тесты заканчиваются или когда тест публикует некоторые дополнительные данные. Эти сторонние реализации TestExecutionListener могут делать то, что хотят, и они могут не быть потокобезопасными.

...