You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ScalaTest技术问询:如何获取测试类的所有测试列表及跨测试类获取测试信息

我来一步步帮你解决这两个ScalaTest相关的问题:

问题1:获取ScalaTest测试类中的所有测试列表

ScalaTest的所有测试类都继承自Suite trait,这个 trait 提供了公开的testNames方法,能直接返回该测试类中所有测试的名称列表——不管你用的是FunSuite、FlatSpec还是其他风格的测试类,这个方法都稳定可用。

举个简单的例子,假设你有一个测试类:

import org.scalatest.FunSuite

class MySampleTest extends FunSuite {
  test("should calculate sum correctly") {
    assert(2 + 3 == 5)
  }
  test("should handle empty string") {
    assert("".isEmpty)
  }
}

你可以通过实例化这个测试类并调用testNames来获取所有测试:

val testSuite = new MySampleTest
val allTests = testSuite.testNames.toList
// allTests 结果为 List("should calculate sum correctly", "should handle empty string")

如果是用FlatSpec这类行为描述风格的测试类,比如:

import org.scalatest.FlatSpec

class MyFlatSpecTest extends FlatSpec {
  "A String" should "be non-empty when trimmed" in {
    assert("  hello  ".trim.nonEmpty)
  }
  it should "return length correctly" in {
    assert("test".length == 4)
  }
}

调用testNames同样能拿到对应的描述字符串:List("A String should be non-empty when trimmed", "A String should return length correctly")


问题2:在另一个测试类中获取目标测试类的测试列表,以及解析testcase格式报告

方式1:直接通过Suite API跨类获取

如果不需要依赖测试报告,直接在你的Test Class Two中实例化Test Class One,调用testNames就能拿到所有测试信息,非常直接。

比如Test Class One:

import org.scalatest.FunSuite

class TestClassOne extends FunSuite {
  test("should fulfill some condition") {
    assert(true)
  }
  test("should validate user input") {
    assert("user".nonEmpty)
  }
}

然后在Test Class Two中获取它的测试列表:

import org.scalatest.FunSuite

class TestClassTwo extends FunSuite {
  test("retrieve all tests from TestClassOne") {
    // 实例化目标测试类
    val testOneSuite = new TestClassOne
    // 获取测试列表
    val testOneTests = testOneSuite.testNames.toList
    
    // 可以做断言验证或者打印输出
    assert(testOneTests.contains("should fulfill some condition"))
    println("TestClassOne的所有测试:")
    testOneTests.foreach(println)
  }
}

方式2:解析JUnit风格的XML测试报告

如果你的测试已经生成了类似<testcase classname="ABC" name="should fulfill some condition" time="12.22">格式的XML报告(ScalaTest默认支持生成JUnit风格报告),你可以用Scala内置的XML解析工具提取这些信息。

假设你的报告文件路径是target/surefire-reports/TEST-TestClassOne.xml,可以这样解析:

import scala.xml.XML

// 加载XML报告文件
val report = XML.loadFile("target/surefire-reports/TEST-TestClassOne.xml")

// 提取所有testcase节点的信息
val testCases = (report \\ "testcase").map { node =>
  val className = node.attribute("classname").map(_.text).getOrElse("未知类")
  val testName = node.attribute("name").map(_.text).getOrElse("未知测试")
  val time = node.attribute("time").map(_.text).getOrElse("0.0")
  (className, testName, time)
}

// 筛选出TestClassOne的测试并打印
testCases.filter(_._1 == "TestClassOne").foreach { case (cls, name, t) =>
  println(s"测试类:$cls,测试名称:$name,耗时:$t秒")
}

这个方法适合你已经生成了测试报告,需要离线分析的场景。


内容的提问来源于stack exchange,提问作者kanav anand

火山引擎 最新活动