2017-01-25 10 views
1

Я пытаюсь использовать ScalaTest с ScalaCheck для тестирования на основе свойств. У меня есть тесты, описанные ниже:ScalaCheck не подводит?

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

Теперь то, что я вижу в том, что если я продолжу запуск тестов в PropSpec1 снова и снова, иногда второй тест проходит, но большая часть времени она не сможет. Теперь, если 0 не проверено на b, то, очевидно, это пройдет, но я бы подумал, что это одна из вещей, которые она всегда будет пытаться. Я вижу такое же поведение при повторном тестировании sbt clean; иногда проходят оба теста.

Это нормально для тестирования на основе свойств, или есть что-то, что мне нужно делать (например, всегда предоставляя собственный генератор)?

ответ

0

, но я бы подумал, что это одна из вещей, он всегда будет пытаться

Предположения являются корнем всех зол.

В принципе, все, что вы попросили произвести для вас Scalacheck, это образец Int. Действующий Int может быть одним из ~ 4 миллиардов значений.

Поскольку вы знаете, что 0 будет случаю провал этой функции (исключение брошено), вы можете просто отфильтровать его, как так:

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

PS Если вы проверяете scaladoc для функции whenever там аналогичный пример того, что вы здесь задали.

+0

Спасибо ... Я знаю о любом случае. Я больше заинтересован в том, чтобы заставить его попробовать крайние случаи или, по крайней мере, сказать, что он должен помнить, чтобы попробовать 0 (что в данном случае не имеет смысла, но является более общей проблемой). Есть что-то для этого? – ashic

+0

Насколько мне известно, вам придется предоставить собственный генератор. Может быть, есть и другой способ, может быть, кто-то еще зазвонит. –