如何在报告中添加scalatest标签?

时间:2019-03-24 11:46:39

标签: scala junit scalatest

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

"A test" should "test something" taggedAs (Smoke) in {
 ....
}

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

试图四处查看,但找不到任何答案,只是如何基于这些Tag对象禁用/启用测试。

1 个答案:

答案 0 :(得分:1)

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

JUnitXmlReporter 通过-u argument配置后,将以JUnit的XML格式生成报告:

Test / testOptions += Tests.Argument("-u", "target")

给出以下测试:

class HelloSpec extends FlatSpec with Matchers  {

 object Slow extends Tag("Slow")
 object Unreliable extends Tag("Unreliable")

 "The Hello object" should "say hello" taggedAs (Slow) in {
   assert(true)
 }

 it should "sing lullaby" taggedAs (Unreliable, Slow) in {
   assert(true)
 }
}

默认情况下, 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>
...

我们希望将测试的tags添加到报告中,如下所示:

...
  <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>
...

如何创建自定义记者?

  1. 通过扩展JUnitXmlReporter创建自定义报告程序:

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

    private var tags: Map[String, Set[String]] = Map.empty
    
  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
      }
    
    

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

    测试中的
  1. Mixin BeforeAndAfterAll特性:
    class HelloSpec extends FlatSpec with Matchers with BeforeAndAfterAll {
    
  2. 搭载Suite.tags 作为InfoProvided事件的payload自变量 通过Informer传递给记者:
    override def beforeAll(): Unit = {
        info("", Some(tags))
      }
    
  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 _ =>
        }
      }
    

如何配置SBT以通过自定义报告程序生成报告?

  1. 将自定义报告者JUnitReporterWithTags的全限定名称提供给-C argument
    Test / testOptions += Tests.Argument("-C", "org.scalatest.tools.JUnitReporterWithTags")
    
  2. 使用sbt test
  3. 生成报告
  4. 报告应在target/TEST-example.HelloSpec.xml
  5. 中创建