Scala如何让断言报错直接返回列表匹配失败的位置而非对象本身
Scala测试多组输入校验断言自动显示失败位置的解决方案
方案1:使用ScalaTest内置Inspectors(推荐)
如果使用ScalaTest作为测试框架,可以直接使用内置的Inspectors.forAll检查器,无需手动处理索引,断言失败时会自动输出不匹配的下标位置、预期值和实际值:
import org.scalatest.Inspectors.forAll test("Comparison") { val list: List[String] = List("Thing", "Entity", "Variable") val expected: List[String] = List("Thingg", "Entityy", "Variablee") forAll(list.zip(expected)) { case (actual, expect) => assert(actual == expect) } }
报错示例:
Failure at index 0: expected "Thingg", actual "Thing"
方案2:zipWithIndex遍历+assert自定义消息
如果不想引入额外工具,可通过zipWithIndex在遍历时直接拿到下标,利用Scala assert的第二个传名参数存放报错信息,不需要提前拼接也不需要额外条件判断:
test("Comparison") { val list: List[String] = List("Thing", "Entity", "Variable") val expected: List[String] = List("Thingg", "Entityy", "Variablee") list.zip(expected).zipWithIndex.foreach { case ((actual, expect), idx) => assert(actual == expect, s"匹配失败,索引位置:$idx,实际值:$actual,预期值:$expect") } }
说明:Scala的assert第二个参数是传名参数,仅在断言失败时才会求值计算字符串,正常测试运行时不会产生额外的拼接开销,完全满足你的需求。
方案3:直接断言集合全等
如果你的场景仅需要校验两个列表所有元素完全匹配,不需要在遍历中做其他操作,直接断言两个列表相等即可,绝大多数Scala测试框架(ScalaTest、munit等)的集合相等断言都会自动输出第一个不匹配的位置:
test("Comparison") { val list: List[String] = List("Thing", "Entity", "Variable") val expected: List[String] = List("Thingg", "Entityy", "Variablee") assert(list == expected) // ScalaTest 写法:list shouldBe expected // munit 写法:assertEquals(list, expected) }
内容的提问来源于stack exchange,提问作者user17019604
相关产品推荐
相关产品推荐

