首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过分级定制Junit5测试输出

通过分级定制Junit5测试输出
EN

Stack Overflow用户
提问于 2021-11-18 23:39:39
回答 2查看 515关注 0票数 1

我试图从junit测试中输出BDD,如下所示:

代码语言:javascript
复制
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布尔值。

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

代码语言:javascript
复制
test {
    useJUnitPlatform()
    testLogging {
        showStandardStreams = true
    }
}

这会产生..。

代码语言:javascript
复制
> 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 +额外空白行的行)。

代码语言:javascript
复制
Adv Name Search STANDARD_OUT

是否有一种方法可以避免在test部分中显示额外的Gradle日志记录?

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

如有任何帮助/建议,我们将不胜感激。

最新情况(1)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-04 16:54:13

您可以用以下内容替换test { … }配置,以获得所需的内容:

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

也见onOutput

FWIW,我最初发布了以下(不完整)答案,结果是集中在配置测试日志的错误方法上:

我不相信这是可能的。让我解释一下原因。 查看生成您不想看到的行的代码,似乎不可能简单地以不同的方式配置这些代码:

  1. 这里是在测试中打印出标准内容时运行的代码。
  2. 它调用下一个无条件加的方法是测试描述符和事件名(→,STANDARD_OUT),您不想看到它。没办法把这个关掉。

因此,更改标准输出的记录方式可能不会被更改。

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

  1. 运行测试基本上意味着在一个单独的进程中运行一些测试工具--在您的情况下是JUnit 5。
  2. 这个工具对谁运行它一无所知/不多;它可能也不应该关心它。即使工具应该提供一个记录器,或者如果您创建自己的记录器并作为测试的一部分运行它,那么记录器仍然必须在某个地方打印它的日志输出。
    • 测试工具过程最明显的“某个地方”是标准的,在这种情况下,我们什么也赢不了。
    • 即使Gradle与用于交换日志消息的测试工具之间存在一些进程间通信,您仍然必须在Gradle端找到一些配置可能性,以配置Gradle如何将接收到的日志消息打印到控制台。我认为不存在这种配置的可能性(更不用说日志消息的IPC )。
票数 1
EN

Stack Overflow用户

发布于 2021-11-28 10:37:47

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

从文件中

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70028116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档