2017-01-25 4 views
1

Ich versuche ScalaTest mit ScalaCheck zu verwenden, um eigenschaftsbasiertes Testen durchzuführen.ScalaCheck nicht fehlgeschlagen?

import org.scalatest.prop.PropertyChecks 
import org.scalatest.{FlatSpec, Matchers} 


object Calc { 
    def add(a:Int, b:Int) = a+b 

    def div(a:Int, b:Int) = a/b 
} 


class PropSpec1 extends FlatSpec with Matchers with PropertyChecks { 
    behavior of Calc.getClass.getName 


    it should "add integers" in { 
    forAll { (a: Int, b: Int) => 
     Calc.add(a, b) shouldEqual a + b 
    } 
    } 

    it should "divide integers" in { 
    forAll { 
     (a:Int, b:Int) => Calc.div(a, b) shouldEqual a/b 
    } 
    } 
} 

Nun, was ich sehe, ist, dass, wenn ich halte die Tests in PropSpec1 immer und immer wieder ausgeführt wird, manchmal der zweite Test bestanden wird, aber die meiste Zeit ist es nicht: Ich habe die Tests unten beschrieben habe. Nun, wenn 0 nicht für b getestet wird, dann wird es offensichtlich passieren, aber ich hätte gedacht, dass es eines der Dinge ist, die es immer versuchen würde. Ich sehe das gleiche Verhalten beim wiederholten Ausführen von sbt clean test; manchmal gehen beide Tests.

Ist das für eigenschaftsbasierte Tests normal, oder muss ich etwas tun (wie immer meinen eigenen Generator zur Verfügung stellen)?

Antwort

0

aber ich habe gedacht, das ist eines der Dinge, wäre es immer

Annahmen sind die Wurzel aller Übel versuchen.

Im Grunde ist alles, was Sie Scalacheck gebeten haben, für Sie zu generieren, ein Beispiel von Int. Ein gültiger Int kann einer von ~ 4 Milliarden Werten sein.

Da wissen Sie, dass eine 0 einen Fehler dieser Funktion Fall (eine Ausnahme ausgelöst wird), können Sie es einfach herausfiltern, wie so:

forAll { (a:Int, b:Int) => 
    whenever(a != 0 && b != 0) { 
    Calc.div(a, b) mustEqual a/b 
    } 
} 

PS Wenn Sie die scaladoc für die Funktion whenever überprüfen dort ist ein ähnliches Beispiel zu dem, was Sie hier gefragt haben.

+0

Danke ... Ich weiß über wann. Ich bin eher daran interessiert, Edge-Cases zu versuchen oder zumindest zu sagen, dass ich daran denke, 0 zu versuchen (was in diesem Fall keinen Sinn ergibt, aber ein allgemeineres Problem ist). Gibt es dafür etwas? – ashic

+0

Nach meinem Wissen müssen Sie einen benutzerdefinierten Generator bereitstellen. Es könnte einen anderen Weg geben, vielleicht wird jemand anderes hereinspielen. –

Verwandte Themen