ScalaTest - 检查浮点数和包含浮点数的对象的“几乎相等”

时间:2015-04-29 08:46:12

标签: scala floating-point scalatest

在使用浮点数或包含浮点数的对象(如向量或矩阵)编写操作的测试时,我经常想要测试不是为了相等,而是为了“几乎相等”(差异允许是某些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)

1 个答案:

答案 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]子类。