2015-04-29 5 views
8

Durante la scrittura di test per operazioni con float o oggetti contenenti float (come vettori o matrici), spesso voglio testare non per l'uguaglianza, ma per "quasi uguale" (la differenza può essere un po 'epsilon).ScalaTest - controlla "quasi uguale" per float e oggetti che contengono float

Quando si utilizza ScalaTest FunSuite, si scrive normalmente assert(xxx == yyy). Con float e likes posso scrivere assert(math.abs(xxx - yyy)<epsilon), ma poi non ho la bella caratteristica dello ScalaTest assert macro di essere riportato i valori confrontati come parte del messaggio di errore.

Come è possibile eseguire il test di float "quasi uguaglianza" in ScalaTest, in modo che quando il test fallisce, i valori vengono scritti come parte del messaggio di errore?

esempio di prova:

import org.scalatest.FunSuite 

class FloatTest extends FunSuite { 
    test("Testing computations") { 
    import math._ 
    assert(sin(Pi/4)==sqrt(0.5)) 
    assert(sin(Pi)==0) 
    } 
} 
+0

[http://stackoverflow.com/questions/27213930/scalatest-testing-equality-between-two-floating-point-arrays-with-error-margin](http://stackoverflow.com/questions/27213930/scalatest-testing-equality-between-two-floating-point-array-with-error-margin) – user2829759

+0

Anche se questo è un duplicato e l'ho contrassegnato come tale, tuttavia in seconda lettura la domanda di destinazione è correlata, ma diversa , si tratta di doppi test che passano inaspettatamente, non di come farli passare. – Suma

risposta

13

Esso può essere fatto utilizzando TolerantNumerics e utilizzando === invece di ==.

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) 
    } 
} 

Per i propri tipi si possono definire il proprio sottoclassi di Equality[T].

Problemi correlati