如何在scalacheck上重用生成的数据

时间:2016-07-26 21:32:34

标签: scalacheck

在我们的系统中,我们有很多为scalacheck生成的大对象。所有属性都具有相同的数据结构,因此似乎没有必要为每个属性生成案例。它们应该被重用。 我知道这样的事情 import org.scalacheck.P​​rop。{forAll,BooleanOperators}

val complexProp = forAll { (m: Int, n: Int) =>
  val res = myMagicFunction(n, m)
  (res >= m)    :| "result > #1" &&
  (res >= n)    :| "result > #2" &&
  (res < m + n) :| "result not sum"
}

但是这太乱了,我想编写单独的测试,但每次重复使用相同的数据,是否可能?

1 个答案:

答案 0 :(得分:0)

我最终扩展了Prop,换句话说,制作了我自己的Properties版本,其输入对于所有属性都是相同的,例如

class MyProperties(implicit dataArb:Arbitrary[InputData]) extends Prop{

     private val tests = new scala.collection.mutable.ListBuffer[( String, Response => Boolean )]

    def apply( p: Gen.Parameters ) = customProperties( p )

    def property( name: String )( f: Response => Boolean ): Unit = tests += name -> f

    def customProperties: Prop = {
      Prop.forAll {
        ( data: InputData ) =>
          tests.foldLeft( Prop.passed ) {
            case ( r, ( name, p ) ) =>
              val response = methodThatUsesInputData( data ).exists( p )
              val label = if ( response ) name
              else
                s"""
                 |$name:
                 |${generateAnScalaTestFromInputData( data )}
               """.stripMargin
              r && ( label |: response )
          }
      }
    }
}

基本上,您可以用与ScalaTest类似的方式编写属性,即

object PropertiesOfMine extends MyProperties {
   property("some property"){
      response => some-boolean-from-response
   }
}

methodThatUsesInputData是我们想要测试的实际逻辑 generateAnScalaTestFromInputData是我们拥有的一个实用程序,它为给定InputData对象的ScalaTest生成代码