ScalaTest - 检查 "almost equal" 是否有浮点数和包含浮点数的对象
ScalaTest - check for "almost equal" for floats and objects containing floats
在为浮点数或包含浮点数的对象(如向量或矩阵)的操作编写测试时,我经常想测试的不是相等性,而是 "almost equal"(差异允许为一些 epsilon)。
当使用 ScalaTest FunSuite, one normally writes assert(xxx == yyy)
. With floats and likes I can write assert(math.abs(xxx - yyy)<epsilon)
, but then I do not get the nice feature of the ScalaTest assert macro 作为失败消息的一部分报告比较值时。
如何在 ScalaTest 中执行 float "almost equality" 测试,以便在测试失败时,将值作为失败消息的一部分写入?
测试示例:
import org.scalatest.FunSuite
class FloatTest extends FunSuite {
test("Testing computations") {
import math._
assert(sin(Pi/4)==sqrt(0.5))
assert(sin(Pi)==0)
}
}
可以使用 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].
子类
在为浮点数或包含浮点数的对象(如向量或矩阵)的操作编写测试时,我经常想测试的不是相等性,而是 "almost equal"(差异允许为一些 epsilon)。
当使用 ScalaTest FunSuite, one normally writes assert(xxx == yyy)
. With floats and likes I can write assert(math.abs(xxx - yyy)<epsilon)
, but then I do not get the nice feature of the ScalaTest assert macro 作为失败消息的一部分报告比较值时。
如何在 ScalaTest 中执行 float "almost equality" 测试,以便在测试失败时,将值作为失败消息的一部分写入?
测试示例:
import org.scalatest.FunSuite
class FloatTest extends FunSuite {
test("Testing computations") {
import math._
assert(sin(Pi/4)==sqrt(0.5))
assert(sin(Pi)==0)
}
}
可以使用 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].
子类