Комбинация Windows, Gradle и Cucumber выдает IOException при генерации отчетов - PullRequest
2 голосов
/ 11 марта 2019

Я работаю над проектом, который использует комбинацию Windows, Java, Groovy, Gradle и Cucumber. Эта комбинация дает мне некоторые проблемы на моей машине с Windows, с которыми не сталкиваются мои коллеги * NIX. После запуска сборки gradle gradle хочет вывести некоторые отчеты. Местоположение и имя файла этих отчетов, по-видимому, определяется определением или результатами тестов на огурец. К сожалению, используемое имя не может использоваться в качестве имени файла, поэтому я получаю IOException для каждого отчета о тестировании.

Для теста на огурец мы используем следующую структуру:

  Scenario Outline: Receive and parse ReturnItem from Service
    Given The message from service return item outlined in <messagePath>
    When We process the message
    Then XXX posted a message to YYY on topic <topic> with event <eventType>
    And payload matches <resultPath>

 | messagePath               | topic      | eventType  | resultPath                 |
 | /test/testxml.xml         | test_topic | EVENT_TYPE | /result/result.json        |

После запуска я получаю следующее исключение:

Caused by: org.gradle.api.UncheckedIOException: Could not write to file 'C:\xxx\project\build\reports\tests\test\packages\| \test\testxml.xml | test_topic | EVENT_TYPE | \result\result.html'.
        at org.gradle.internal.IoActions$TextFileWriterIoAction.execute(IoActions.java:151)
        at org.gradle.internal.IoActions$TextFileWriterIoAction.execute(IoActions.java:127)
        at org.gradle.internal.IoActions.writeTextFile(IoActions.java:45)
        at org.gradle.reporting.HtmlReportRenderer$DefaultHtmlReportContext.renderHtmlPage(HtmlReportRenderer.java:118)
        at org.gradle.api.internal.tasks.testing.report.DefaultTestReport$HtmlReportFileGenerator.run(DefaultTestReport.java:147)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.access$900(DefaultBuildOperationExecutor.java:48)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$ParentPreservingQueueWorker.execute(DefaultBuildOperationExecutor.java:342)
        at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable.runOperation(DefaultBuildOperationQueue.java:230)
        at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable.access$600(DefaultBuildOperationQueue.java:172)
        at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable$1.call(DefaultBuildOperationQueue.java:209)
        at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable$1.call(DefaultBuildOperationQueue.java:203)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:154)
        at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable.runBatch(DefaultBuildOperationQueue.java:203)
        at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable.run(DefaultBuildOperationQueue.java:177)
        ... 3 more
Caused by: java.io.IOException: Unable to create directory 'C:\xxx\project\project-test\build\reports\tests\test\packages\| \test\testxml.xml | test_topic | EVENT_TYPE | \result'
        at org.gradle.internal.IoActions$TextFileWriterIoAction.execute(IoActions.java:141)
        ... 19 more

Кто-нибудь знает, как это исправить? Единственное «решение», которое я мог придумать, - это отключение отчетов, которое работает, но это скорее обходной путь, чем решение. Для отключения я использовал следующую конфигурацию в gradle.build для этого:

    apply plugin: 'java'
    apply plugin: 'groovy'

    test {
        reports {
            junitXml.enabled = false
            html.enabled = false
        }
    }

(Вдохновлено: Как заставить сборку Gradle создавать отчет о тестировании HTML вместо XML по умолчанию? )

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Я наконец нашел виновника. По-видимому, эти имена файлов соответствуют поведению JUnit по умолчанию для генерации отчетов по тестам Cucumber. В * NIX это не создает никаких проблем. Однако в Windows это приведет к исключению из-за каналов в Examples. IOException является чем-то особенным, так как большинство исключений, которые я нашел в Интернете, были FileNotFoundException s. Это объясняет, почему мне потребовалось так много времени, чтобы найти ответ, и я сосредоточился на исключении.

Решение здесь заключается в использовании следующей JUnitOption в качестве @CucumberOptions аннотации при выполнении тестов на огурец: --filename-compatible-names.

Пример кода для Java & Spring выглядит следующим образом:

@RunWith(Cucumber.class)
@CucumberOptions(junit = {"--filename-compatible-names"})
public class CucumberRunner {
}

Было бы неплохо, если бы этот тип неразрушающих ОС-зависимых параметров был бы по умолчанию, а не дополнительным.

1 голос
/ 11 марта 2019

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

'C:\xxx\project\project-test\build\reports\tests\test\packages\| \test\testxml.xml | test_topic | EVENT_TYPE | \result'

Можете ли вы показать код при передаче messagePath? Я подозреваю, что вы передаете всю строку данных, а не только messagePath (я собираюсь сделать дикое предположение, что вы выполняете .toString () над массивом вместо того, чтобы передавать первый элемент массива )

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