Минимальные успешные тесты для свойств, специфичные для ScalaCheck

Я пытаюсь убедиться, что мое свойство 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
> 

Как мне на самом деле передать это моей собственности?


person Chris Stewart    schedule 01.08.2016    source источник
comment
Я думаю, вы называете это из sbt? Можете ли вы показать нам, как вы называете это свойство? а может попробовать с property.check из REPL?   -  person jopasserat    schedule 01.08.2016
comment
Я использую sbt, я добавлю команду в OP   -  person Chris Stewart    schedule 01.08.2016
comment
Похоже, когда я запускаю его из консоли, я также получаю только 100 пройденных тестов scala> res1._2.check + OK, passed 100 tests.   -  person Chris Stewart    schedule 01.08.2016
comment
как насчет res1._2.check(_.withMinSuccessfulTests(500))?   -  person jopasserat    schedule 01.08.2016
comment
Это работает, но на самом деле не отвечает на первоначальный вопрос - должен быть какой-то способ передать эти параметры классу и запустить их с помощью sbt.   -  person Chris Stewart    schedule 01.08.2016


Ответы (2)


Насколько я понимаю, вы можете указать параметры теста на двух уровнях, и они, похоже, не взаимодействуют.

Первый вариант находится внутри свойства, как вы пытаетесь сделать:

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 или непосредственно внутри класса.

Теперь, если вы хотите повлиять на количество тестов, выполняемых при вызове цели sbt:test, похоже, вам придется поиграть с параметрами build.sbt (взятыми из здесь):

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")
person jopasserat    schedule 01.08.2016
comment
Кажется, это не позволяет устанавливать настройки для каждого теста или свойства? - person nafg; 05.12.2016

Определенно есть более простой способ добиться этого, чем переопределить любую глобальную тестовую конфигурацию:

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
      }
    }
  }
}
person flavian    schedule 01.08.2016
comment
Похоже, вы используете ScalaTest? - person Chris Stewart; 01.08.2016
comment
Привет @ChrisStewart, да, это был просто пример, DSL не специфичен для ScalaTest, по крайней мере, для стороны forAll. - person flavian; 02.08.2016
comment
как это работает с явным генератором, заданным в функции Prop.forAll()? - person Chris Stewart; 02.08.2016
comment
@ChrisStewart Посмотрите на сигнатуру метода, я думаю, для вас есть доступная перегрузка, которая принимает генератор в качестве первого аргумента, а мин проходит в качестве следующего. - person flavian; 11.08.2016
comment
Я не вижу способа сделать это с помощью vanilla scalacheck sbt framework. - person nafg; 05.12.2016