【问题标题】:Specs2 won't print scalacheck counterexamples?Specs2 不会打印 scalacheck 反例?
【发布时间】:2016-09-02 19:50:44
【问题描述】:

我正在使用 specs2 来运行我的测试。我能够让它运行 scalacheck,但在下面(当我使用 sbt 测试运行时)它不会打印反例。如果没有反例,这几乎是无用的:

import org.specs2.mutable.Specification

import org.scalacheck.Properties
import org.scalacheck.Prop
import org.specs2.ScalaCheck
import org.specs2.scalacheck.Parameters
import org.scalacheck.Gen

class StripeExportSpec extends Specification with ScalaCheck  {
  import StripeExportJob._

  //.verbose makes no difference
  implicit val params = Parameters().setVerbosity(10) 

  val p2: Properties =  new Properties("dayIntervals") {

    val dayEpochs = for {
      n <- Gen.choose(1l, 500l)
      m <- Gen.choose(n, 500l)
    } yield (n*twentyFourHours,m*twentyFourHours)

    property("aligns start to first parameter") = Prop.forAll(dayEpochs) { x: (Long,Long) =>
      val (a, b) = x
      val result = dayIntervals(a, b)
      result.head._1 == a
    }

    property("aligns end correctly to 24 hours after b") = Prop.forAll(dayEpochs) { x: (Long,Long) =>
      val (a, b) = x
      val result = dayIntervals(a, b)
      result.last._2 == b+twentyFourHours
    }

  }

  //s2"dayIntervals respects ${properties(p2)}"

  "dayIntervals respects " >> addFragments(properties(p2))

}

我得到的只是:

[info] StripeExportSpec
[info] 
[info] dayIntervals respects 
[info] 
[error]     ! dayIntervals.aligns start to first parameter
[error]      java.lang.AssertionError: assertion failed (StripeExport.scala:157)
[error] com.handy.pipeline.jobs.StripeExportJob$.dayIntervals(StripeExport.scala:157)
[error] com.handy.pipeline.jobs.StripeExportSpec$$anon$1$$anonfun$2.apply(StripeExportSpec.scala:28)
[error] com.handy.pipeline.jobs.StripeExportSpec$$anon$1$$anonfun$2.apply(StripeExportSpec.scala:26)
[error] org.scalacheck.Prop$$anonfun$forAllShrink$1$$anonfun$3.apply(Prop.scala:713)
[error] org.scalacheck.Prop$$anonfun$forAllShrink$1$$anonfun$3.apply(Prop.scala:713)
[error] org.scalacheck.Prop$.secure(Prop.scala:457)
[error] org.scalacheck.Prop$$anonfun$forAllShrink$1.org$scalacheck$Prop$$anonfun$$result$1(Prop.scala:713)
[error] org.scalacheck.Prop$$anonfun$forAllShrink$1$$anonfun$4.apply(Prop.scala:720)
[error] org.scalacheck.Prop$$anonfun$forAllShrink$1$$anonfun$4.apply(Prop.scala:720)
[error] org.scalacheck.Prop$$anonfun$forAllShrink$1.getFirstFailure$1(Prop.scala:720)
[error] org.scalacheck.Prop$$anonfun$forAllShrink$1.shrinker$1(Prop.scala:730)
[error] org.scalacheck.Prop$$anonfun$forAllShrink$1.apply(Prop.scala:752)
[error] org.scalacheck.Prop$$anonfun$forAllShrink$1.apply(Prop.scala:707)
[error] org.scalacheck.Prop$$anonfun$apply$5.apply(Prop.scala:292)
[error] org.scalacheck.Prop$$anonfun$apply$5.apply(Prop.scala:291)
[error] org.scalacheck.PropFromFun.apply(Prop.scala:22)
[error] org.scalacheck.Test$.org$scalacheck$Test$$workerFun$1(Test.scala:294)
[error] org.scalacheck.Test$$anonfun$3.apply(Test.scala:323)
[error] org.scalacheck.Test$$anonfun$3.apply(Test.scala:323)
[error] org.scalacheck.Platform$.runWorkers(Platform.scala:40)
[error] org.scalacheck.Test$.check(Test.scala:323)
[error] com.handy.pipeline.jobs.StripeExportSpec.check(StripeExportSpec.scala:14)
[info] 
[error]     ! dayIntervals.aligns end correctly to 24 hours after b
[error]      java.lang.AssertionError: assertion failed (StripeExport.scala:157)
[error] com.handy.pipeline.jobs.StripeExportJob$.dayIntervals(StripeExport.scala:157)
[error] com.handy.pipeline.jobs.StripeExportSpec$$anon$1$$anonfun$5.apply(StripeExportSpec.scala:34)
[error] com.handy.pipeline.jobs.StripeExportSpec$$anon$1$$anonfun$5.apply(StripeExportSpec.scala:32)
[error] org.scalacheck.Prop$$anonfun$forAllShrink$1$$anonfun$3.apply(Prop.scala:713)
[error] org.scalacheck.Prop$$anonfun$forAllShrink$1$$anonfun$3.apply(Prop.scala:713)
[error] org.scalacheck.Prop$.secure(Prop.scala:457)
[error] org.scalacheck.Prop$$anonfun$forAllShrink$1.org$scalacheck$Prop$$anonfun$$result$1(Prop.scala:713)
[error] org.scalacheck.Prop$$anonfun$forAllShrink$1$$anonfun$4.apply(Prop.scala:720)
[error] org.scalacheck.Prop$$anonfun$forAllShrink$1$$anonfun$4.apply(Prop.scala:720)
[error] org.scalacheck.Prop$$anonfun$forAllShrink$1.getFirstFailure$1(Prop.scala:720)
[error] org.scalacheck.Prop$$anonfun$forAllShrink$1.shrinker$1(Prop.scala:730)
[error] org.scalacheck.Prop$$anonfun$forAllShrink$1.apply(Prop.scala:752)
[error] org.scalacheck.Prop$$anonfun$forAllShrink$1.apply(Prop.scala:707)
[error] org.scalacheck.Prop$$anonfun$apply$5.apply(Prop.scala:292)
[error] org.scalacheck.Prop$$anonfun$apply$5.apply(Prop.scala:291)
[error] org.scalacheck.PropFromFun.apply(Prop.scala:22)
[error] org.scalacheck.Test$.org$scalacheck$Test$$workerFun$1(Test.scala:294)
[error] org.scalacheck.Test$$anonfun$3.apply(Test.scala:323)
[error] org.scalacheck.Test$$anonfun$3.apply(Test.scala:323)
[error] org.scalacheck.Platform$.runWorkers(Platform.scala:40)
[error] org.scalacheck.Test$.check(Test.scala:323)
[error] com.handy.pipeline.jobs.StripeExportSpec.check(StripeExportSpec.scala:14)

【问题讨论】:

    标签: scala specs2 scalacheck


    【解决方案1】:

    这是 specs2 中的一个错误,当您在属性中抛出 AssertionErrors(或任何类型的 java.lang.Error)时会发生此错误。这已在 3.8.4-20160905063548-8470e96 中修复。

    此外,由于您使用的是规范,因此您不必使用 ScalaCheck Properties。你可以写:

    "dayIntervals" >> {
    
      "aligns start to first parameter" >> Prop.forAll(dayEpochs) { x: (Long,Long) =>
        val (a, b) = x
        val result = dayIntervals(a, b)
        result.head._1 === a
      }
    
      // another way of using generators
      "aligns end correctly to 24 hours after b" >> prop { x: (Long,Long) =>
        val (a, b) = x
        val result = dayIntervals(a, b)
        result.last._2 === b+twentyFourHours
      }.setGen(dayEpochs)
    
    }
    
    val dayEpochs = for {
      n <- Gen.choose(1l, 500l)
      m <- Gen.choose(n, 500l)
    } yield (n*twentyFourHours,m*twentyFourHours)
    

    【讨论】:

    • 谢谢,我稍后再测试一下 - 我刚刚开始使用裸 scalacheck 开始工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    相关资源
    最近更新 更多