在我们的系统中,我们有很多为scalacheck生成的大对象。所有属性都具有相同的数据结构,因此似乎没有必要为每个属性生成案例。它们应该被重用。 我知道这样的事情 import org.scalacheck.Prop。{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"
}
但是这太乱了,我想编写单独的测试,但每次重复使用相同的数据,是否可能?
答案 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生成代码