Windows,Gradle和Cucumber组合在生成报告时会引发IOException



我正在研究一个使用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:xxxprojectbuildreportsteststestpackages| testtestxml.xml | test_topic | EVENT_TYPE | resultresult.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:xxxprojectproject-testbuildreportsteststestpackages| testtestxml.xml | test_topic | EVENT_TYPE | result'
        at org.gradle.internal.IoActions$TextFileWriterIoAction.execute(IoActions.java:141)
        ... 19 more

有人知道如何解决这个问题吗?我唯一能想到的"解决方案"是禁用有效的报告,但比解决方案更重要。为了禁用我在gradle中使用以下配置。为此:

    apply plugin: 'java'
    apply plugin: 'groovy'
    test {
        reports {
            junitXml.enabled = false
            html.enabled = false
        }
    }

(启发:如何使Gradle构建产生HTML测试报告,而不是XML默认值?)

我终于找到了罪魁祸首。显然,这些文件名对应于JUNIT的默认行为,以生成黄瓜测试的报告生成。在 *nix上,这没有任何问题。但是,在Windows上,由于Examples中的管道,这将导致例外。IOException显然有些特别,因为我在Internet上发现的最例外是FileNotFoundException s。这就解释了为什么我花了这么长时间才能找到答案,我专注于例外。

在运行Cucumber测试时,这里的解决方案是将以下JUnitOption用作@CucumberOptions注释:--filename-compatible-names

Java&amp;春天看起来像这样:

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

如果这些非破坏OS依赖性选项为默认而不是可选的,那将是很好的。

基于所提供的信息,它似乎正在尝试创建一个称为:

的目录

'C:xxxprojectproject-testbuildreportsteststestpackages| testtestxml.xml | test_topic | EVENT_TYPE | result'

您可以在messagePath中显示代码吗?我怀疑您正在传递整个数据行,而不仅仅是messagePath(我要疯狂地猜测您在数组上执行.toString(),而不是传递数组的第一个元素)

最新更新