如何向报告添加 scalatest 标签?

JMK*_*JMK 5 junit scala scalatest

我的 scalatest 测试使用标记功能,如下所示:

"A test" should "test something" taggedAs (Smoke) in {
 ....
}
Run Code Online (Sandbox Code Playgroud)

是否有机会将标签添加到使用 scalatest 运行程序的 -u 选项生成的junit 报告中?

试图到处寻找,但除了如何禁用/启用基于这些标签对象的测试之外,找不到任何答案。

Mar*_*lic 6

scalatest-custom-reporter-example是一个工作示例,展示了如何创建自定义Reporter 并将标签作为自定义信息传递 给报告器。

JUnitXmlReporter-u当通过参数 配置时,生成 JUnit 的 XML 格式的报告:

Test / testOptions += Tests.Argument("-u", "target")
Run Code Online (Sandbox Code Playgroud)

给出以下测试:

Test / testOptions += Tests.Argument("-u", "target")
Run Code Online (Sandbox Code Playgroud)

默认情况下, JUnitXmlReporter.xmlify 输出以下字符串:

...
  <testcase 
    name="The Hello object should say hello" classname="example.HelloSpec" time="0.011">
  </testcase>
  <testcase 
    name="The Hello object should sing lullaby" classname="example.HelloSpec" time="0.001">
  </testcase>
...
Run Code Online (Sandbox Code Playgroud)

虽然我们想将测试的标签添加到报告中,如下所示:

...
  <testcase 
    name="The Hello object should say hello" tag="Set(Slow)" classname="example.HelloSpec" time="0.011">
  </testcase>
  <testcase 
    name="The Hello object should sing lullaby" tag="Set(Unreliable, Slow)" classname="example.HelloSpec" time="0.001">
</testcase>
...
Run Code Online (Sandbox Code Playgroud)

如何创建自定义记者?

  1. 通过扩展创建自定义报告器JUnitXmlReporter

    package org.scalatest.tools
    class JUnitReporterWithTags extends JUnitXmlReporter("target")
    
    Run Code Online (Sandbox Code Playgroud)
  2. 添加成员映射以按测试名称保存套件tags

    private var tags: Map[String, Set[String]] = Map.empty
    
    Run Code Online (Sandbox Code Playgroud)
  3. 覆盖xmlify以在输出字符串中注入标签:

      override def xmlify(testsuite: Testsuite): String = {
        var xml = super.xmlify(testsuite)
        for (testcase <- testsuite.testcases) yield {
          xml = xml.replace(s""""${testcase.name}"""", s""""${testcase.name}" tag="${tags(testcase.name)}"""" )
        }
        xml
      }
    
    
    Run Code Online (Sandbox Code Playgroud)

如何将套件的标签作为自定义信息传递给记者?

  1. BeforeAndAfterAll测试中的 Mixin特征:
    class HelloSpec extends FlatSpec with Matchers with BeforeAndAfterAll {
    
    Run Code Online (Sandbox Code Playgroud)
  2. 搭载Suite.tags 作为事件payload的参数InfoProvided,通过以下方式传递给记者Informer
    override def beforeAll(): Unit = {
        info("", Some(tags))
      }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 覆盖JUnitXmlReporter.apply以提取和存储标签有效负载:

      override def apply(event: Event): Unit = {
        super.apply(event)
        event match {
          case e: InfoProvided =>
            e.payload.foreach { providedTags =>
              tags ++= providedTags.asInstanceOf[Map[String, Set[String]]]
            }
    
          case _ =>
        }
      }
    
    Run Code Online (Sandbox Code Playgroud)

如何配置 SBT 通过自定义报告器生成报告?

  1. 将自定义报告者的完全限定名称提供JUnitReporterWithTags-C argument
    Test / testOptions += Tests.Argument("-C", "org.scalatest.tools.JUnitReporterWithTags")
    
    Run Code Online (Sandbox Code Playgroud)
  2. 生成报告sbt test
  3. 报告应创建于target/TEST-example.HelloSpec.xml