【问题标题】:ScalaCheck specificy minimum successful tests for propertyScalaCheck 专门针对属性的最低成功测试
【发布时间】:2018-03-21 00:56:24
【问题描述】:

我正在尝试确保我的 ScalaCheck 属性运行 500 次,而不是默认的 100 次。我在配置这个时遇到了麻烦。

class BlockSpec extends Properties("BlockSpec") with BitcoinSLogger {

  val myParams = Parameters.default.withMinSuccessfulTests(500)
  override def overrideParameters(p: Test.Parameters) = myParams

  property("Serialization symmetry") =
  Prop.forAll(BlockchainElementsGenerator.block) { block =>
    logger.warn("Hex:" + block.hex)
    Block(block.hex) == block
  }
}

但是当我实际运行这个测试时,它只显示 100 个测试成功通过

编辑:

$ sbt
[info] Loading project definition from /home/chris/dev/bitcoins-core/project
[info] Set current project to bitcoin-s-core (in build file:/home/chris/dev/bitcoins-core/)
> test-only *BlockSpec*
[info] + BlockSpec.Serialization symmetry: OK, passed 100 tests.
[info] Elapsed time: 1 min 59.775 sec 
[info] ScalaCheck
[info] Passed: Total 1, Failed 0, Errors 0, Passed 1
[info] ScalaTest
[info] Run completed in 2 minutes.
[info] Total number of tests run: 0
[info] Suites: completed 0, aborted 0
[info] Tests: succeeded 0, failed 0, canceled 0, ignored 0, pending 0
[info] No tests were executed.
[info] Passed: Total 1, Failed 0, Errors 0, Passed 1
[success] Total time: 123 s, completed Aug 1, 2016 11:36:17 AM
> 

我如何实际将其传递给我的财产?

【问题讨论】:

  • 我猜你是从 sbt 调用的?你能告诉我们你是怎么称呼这个属性的吗?也许尝试使用 REPL 中的property.check
  • 我确实使用 sbt,我会将命令添加到 OP
  • 看起来当我从控制台运行它时,我也只通过了 100 个测试scala> res1._2.check + OK, passed 100 tests.
  • res1._2.check(_.withMinSuccessfulTests(500)) 呢?
  • 这确实有效,但它并没有真正回答最初的问题——应该有一些方法可以将这些参数传递给类并使用 sbt 运行它们

标签: scala scalacheck


【解决方案1】:

据我了解,您可以在两个级别上指定测试参数,但它们似乎无法通信。

第一个选项在您尝试执行的属性内:

import org.scalacheck.Properties
import org.scalacheck.Test.{ TestCallback, Parameters }
import org.scalacheck.Prop.{ forAll, BooleanOperators }
import org.scalacheck.Test

class TestFoo extends Properties("BlockSpec") {

  override def overrideParameters(p: Parameters) = 
    p.withMinSuccessfulTests(1000000)

  property("Serialization symmetry") = forAll { n: Int =>
    (n > 0) ==> (math.abs(n) == n)
  }

}

只要您不在该属性上调用.check,这不会产生任何影响。 可以来自 sbt shell 或直接在类中。

现在,如果您想在调用 sbt:test 目标时影响运行的测试数量,看来您必须使用选项 build.sbt(取自 here):

name := "scalacheck-demo"

scalaVersion := "2.11.5"

libraryDependencies += "org.scalacheck" %% "scalacheck" % "1.12.2" % "test"

testOptions in Test += Tests.Argument(TestFrameworks.ScalaCheck, "-maxSize", "5", "-minSuccessfulTests", "33", "-workers", "1", "-verbosity", "1")

【讨论】:

  • 这似乎不允许按测试或按属性设置?
【解决方案2】:

绝对有一种比覆盖任何类型的全局测试配置更简单的方法:

class SampleTest extends FlatSpec
  with Matchers with GeneratorDrivenPropertyChecks {

  it should "work for a basic scenario" in {
    // This will require 500 successful tests to succeed
    forAll(minSuccessful(500)) { (d: String) =>
      whenever (d.nonEmpty) {
        d.length shouldBe > 0
      }
    }
  }
}

【讨论】:

  • 看起来你正在使用 ScalaTest?
  • 嗨@ChrisStewart 是的,这只是一个例子,DSL 不是 ScalaTest 特定的,至少是 forAll 方面。
  • 这如何与Prop.forAll() 函数中给出的显式生成器一起工作?
  • @ChrisStewart 看看方法签名,我认为有一个可用的重载将生成器作为第一个参数,而 min 作为下一个参数传递。
  • 我没有看到任何使用 vanilla scalacheck sbt 框架的方法。
猜你喜欢
  • 2011-05-16
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 2023-03-20
  • 2012-01-15
相关资源
最近更新 更多