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>
...
Как создать собственный репортер?
Создание настраиваемого репортера путем расширения JUnitXmlReporter
:
package org.scalatest.tools
class JUnitReporterWithTags extends JUnitXmlReporter("target")
Добавить карту участника для хранения набора tags
по имени теста:
private var tags: Map[String, Set[String]] = Map.empty
Переопределить 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
}
Как передать теги пакета как пользовательскую информацию репортеру?
- Mixin
BeforeAndAfterAll
черта в тесте:
class HelloSpec extends FlatSpec with Matchers with BeforeAndAfterAll {
- Piggyback
Suite.tags
как payload
аргумент InfoProvided
события, которое
передается репортеру по Informer
:
override def beforeAll(): Unit = {
info("", Some(tags))
}
Переопределить 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 для создания отчета через специальный репортер?
- Дайте полностью квалифицированное имя настраиваемого репортера
JUnitReporterWithTags
-C argument
:
Test / testOptions += Tests.Argument("-C", "org.scalatest.tools.JUnitReporterWithTags")
- Создайте отчет с
sbt test
- Отчет должен быть создан в
target/TEST-example.HelloSpec.xml