【问题标题】:Customising Junit5 test output via Gradle通过 Gradle 自定义 Junit5 测试输出
【发布时间】:2021-12-29 19:56:39
【问题描述】:

我正在尝试从我的 junit 测试中输出 BDD,如下所示:-

Feature: Adv Name Search

  Scenario: Search by name v1

    Given I am at the homepage                         
     When I search for name Brad Pitt 
      And I click the search button2  
     Then I expect to see results with name 'Brad Pitt'

在 IntelliJ IDE 中运行时,这显示得很好,但在 Gradle 中运行时,什么都没有显示。我做了一些研究并启用了测试showStandardStreams boolean 即

在我的build.gradle 文件中我添加了...

test {
    useJUnitPlatform()
    testLogging {
        showStandardStreams = true
    }
}

这会产生...

> Task :test

Adv Name Search STANDARD_OUT
    Feature: Adv Name Search

      Tests the advanced name search feature in IMDB


Adv Name Search > Search by name v1 STANDARD_OUT
      Scenario: Search by name v1

        Given I am at the homepage                          
         When I search for name Brad Pitt                   
          And I click the search button2                    
         Then I expect to see results with name 'Brad Pitt' 

... 这非常接近,但我真的不想看到 gradle 的输出(带有 STANDARD_OUT 的行 + 额外的空白行)。

Adv Name Search STANDARD_OUT

有没有办法不在 test 部分显示额外的 Gradle 日志记录?

或者也许我的测试根本不应该使用System.out.println,而是使用正确的日志记录(例如log4j)+ gradle config来显示这些?

感谢任何帮助/建议。

更新(1)

如果有人想快速克隆和./gradlew clean test,我在https://github.com/bobmarks/stackoverflow-junit5-gradle 创建了一个最小可重现示例。

【问题讨论】:

    标签: gradle logging junit


    【解决方案1】:

    您可以将 test { … } 配置替换为以下内容以获得您需要的内容:

    test {
        useJUnitPlatform()
        systemProperty "file.encoding", "utf-8"
        test {
            onOutput { descriptor, event ->
                if (event.destination == TestOutputEvent.Destination.StdOut) {
                    logger.lifecycle(event.message.replaceFirst(/\s+$/, ''))
                }
            }
        }
    }
    

    另请参阅docs for onOutput。


    FWIW,我最初发布了以下(不完整的)答案,结果证明是针对配置测试日志记录的错误方法:

    我几乎不相信这是可能的。让我试着解释一下原因。

    查看生成您不想看到的行的代码,似乎不可能简单地进行不同的配置:

    1. Here 是在测试中将某些内容打印到标准输出时运行的代码。
    2. 它接下来调用的方法unconditionally adds 是您不想看到的测试描述符和事件名称(→ STANDARD_OUT)。无法关闭此功能。

    因此更改标准输出的记录方式可能无法更改。

    但是,在测试中使用适当的记录器怎么样?我怀疑这是否可行:

    1. 运行测试基本上意味着在一个单独的进程中运行一些测试工具——在你的例子中是 JUnit 5。
    2. 这个工具对谁运行它一无所知。它可能也不应该在意。即使该工具应该提供一个记录器,或者如果您创建自己的记录器并将其作为测试的一部分运行,那么记录器仍然必须在某处打印其日志输出。
      • 测试工具过程中最明显的“某处”再次成为标准,在这种情况下我们不会赢得任何东西。
      • 即使 Gradle 和测试工具之间存在一些进程间通信以交换日志消息,那么您仍然需要在 Gradle 端找到一些配置可能性,以配置 Gradle 如何将接收到的日志消息打印到控制台。我认为不存在这样的配置可能性(更不用说日志消息的 IPC)了。

    【讨论】:

    • 是否可以扩展TestEventLogger 的功能或创建自定义插件?
    • 对不起,我意识到我在最初的答案中过于关注测试日志记录方法。我相信我现在已经找到了解决您问题的方法;请查看我的更新答案。
    • 这很有魅力,传奇!
    【解决方案2】:

    可以做的一件事是在testLogging Options中设置displayGranuality属性

    来自文档

    "要记录的事件的显示粒度。例如,如果设置为0,则方法级别的事件将显示为“Test Run > Test Worker x > org.SomeClass > org.someMethod”。如果设置到2,同样的事件会显示为“org.someClass > org.someMethod”。

    【讨论】:

    • 我已经尝试了displayGranularity 和minGranularity(不同值的组合)以及testLogging { showStandardStreams = true },但它仍然显示我不想要的STANDARD_OUT 行。
    • 我会尝试 displayGranularity = -1
    • 试过displayGranularity = -1 - 仍然显示STANDARD_OUT 行。
    • 你能提供一个最小可重现的例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 2023-03-09
    • 2021-06-09
    相关资源
    最近更新 更多