Как добавить самые масштабные теги в отчет? - PullRequest
4 голосов
/ 24 марта 2019

Мои самые масштабные тесты используют функциональность тегов и выглядят следующим образом:

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

Есть ли шанс добавить теги в отчет Junit , который генерируется с помощью опции -u из самого крупного бегуна?

Пытался искать везде, но не мог найти никакого ответа, кроме как отключить / включить тесты на основе этих объектов тегов.

1 Ответ

2 голосов
/ 01 апреля 2019

scalatest-custom-reporter-example - рабочий пример, показывающий, как создать пользовательский Reporter и передать теги как пользовательскую информацию репортеру.

JUnitXmlReporter генерирует отчет в формате XML JUnit при настройке через аргумент -u :

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

в то время как мы хотели бы добавить тестовые теги в отчет следующим образом:

...
  <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. Piggyback Suite.tags как payload аргумент InfoProvided события, которое передается репортеру по 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. Отчет должен быть создан в target/TEST-example.HelloSpec.xml
...