在使用浮点数或包含浮点数的对象(如向量或矩阵)编写操作的测试时,我经常想要测试不是为了相等,而是为了“几乎相等”(差异允许是某些epsilon)。
使用ScalaTest FunSuite时,通常会写{
"belongsTOId" : "1"
"gender" : "m"
"style" : "freestyle"
"length" : "100"
}
{
"belongsTOId" : "1"
"gender" : "f"
"style" : "butterfly"
"length" : "50"
}
。使用浮点数和喜欢我可以写assert(xxx == yyy)
,但是我没有得到ScalaTest assert macro报告比较值作为失败消息的一部分的好功能。
如何在ScalaTest中执行float“几乎相等”的测试,以便在测试失败时将值写为失败消息的一部分?
测试示例:
assert(math.abs(xxx - yyy)<epsilon)
答案 0 :(得分:17)
可以使用TolerantNumerics并使用===
代替==
来完成。
import org.scalactic.TolerantNumerics
import org.scalatest.FunSuite
class FloatTest extends FunSuite {
val epsilon = 1e-4f
implicit val doubleEq = TolerantNumerics.tolerantDoubleEquality(epsilon)
test("Testing computations") {
import math._
assert(sin(Pi / 4) === sqrt(0.5))
assert(sin(Pi) === 0.0)
}
}
对于您自己的类型,您可以定义自己的Equality[T]子类。