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
>
Как я могу передать это на мою собственность?
3 ответа
Насколько я понимаю, вы можете указать параметры теста на двух уровнях, и они, кажется, не взаимодействуют.
Первый вариант находится внутри свойства, как вы пытаетесь сделать:
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")
Определенно есть более простой способ добиться этого, чем переопределение любого вида глобальной конфигурации тестирования:
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
}
}
}
}
Это выглядит немного по-другому для меня, используяmunit
. Вот что сработало для меня,
import munit.ScalaCheckSuite
import munit.FunSuite
class FoobarTest extends FunSuite with ScalaCheckSuite {
property(
"Foo does the bar"
) {
forAll { (intValue: Int) =>
assert(intValue == intValue)
}
}.check(_.withMinSuccessfulTests(5000))
}