Как использовать генераторы scalacheck в scalatest FlatSpec

Я пытаюсь использовать генераторы свойств scalacheck в тестовом файле scalatest.FlatSpec.

Тест должен завершиться неудачно, и о нем будет сообщено junit framework (и eclipse в моем случае), но тест и ошибка просто отображаются в консоли.

import scala.collection.immutable.TreeSet
import org.junit.runner.RunWith
import org.raisercostin.namek.UnitSpec
import org.scalatest.junit.JUnitRunner
import org.scalatest.FlatSpec
import org.scalatest._

@RunWith(classOf[JUnitRunner])
class SetsTest2 extends FlatSpec with Matchers 
     with OptionValues with Inside with Inspectors {
  import org.scalacheck.Prop
  "set intersection" should "be commutative" in {
    Prop.forAll { (l1: TreeSet[Int], l2: TreeSet[Int]) =>
      l1.intersect(l2) == l1.intersect(l1)
    }.check
  }
}

Вывод следующий

Run starting. Expected test count is: 1
SetsTest2:
set intersection

! Falsified after 1 passed tests.
> ARG_0: TreeSet(0)
> ARG_0_ORIGINAL: TreeSet(1288089760)
> ARG_1: TreeSet()
> ARG_1_ORIGINAL: TreeSet(0)
- should be commutative
Run completed in 505 milliseconds.
Total number of tests run: 1
Suites: completed 1, aborted 0
Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
All tests passed.

Я ожидал, что ошибка всплывет в рамках junit.

У меня есть следующие зависимости:

scalaVersion    = "2.10.4"
"junit" % "junit" % "4.10" % "test"
"org.scalatest" %% "scalatest" % "2.2.4" % "test"
"org.scalacheck" %% "scalacheck" % "1.12.2" % "test"

person raisercostin    schedule 15.03.2015    source источник


Ответы (2)


Вы должны использовать scalatest.prop.Checkers, отличный от scalacheck.Prop.check.

import scala.collection.immutable.TreeSet
import org.junit.runner.RunWith
import org.raisercostin.namek.UnitSpec
import org.scalatest.junit.JUnitRunner
import org.scalatest.FlatSpec
import org.scalatest._
import org.scalatest.prop.Checkers

@RunWith(classOf[JUnitRunner])
class SetsTest2 extends FlatSpec with Matchers 
      with OptionValues with Inside with Inspectors with Checkers {
  import org.scalacheck.Prop
  "set intersection" should "be commutative" in {
    check(Prop.forAll { (l1: TreeSet[Int], l2: TreeSet[Int]) =>
      l1.intersect(l2) == l1.intersect(l1)
    })
  }
}

Теперь вывод следующий

Run starting. Expected test count is: 1
SetsTest2:
set intersection
- should be commutative *** FAILED ***
  GeneratorDrivenPropertyCheckFailedException was thrown during property evaluation.
   (SetsTest.scala:17)
    Falsified after 1 successful property evaluations.
    Location: (SetsTest.scala:17)
    Occurred when passed generated values (
      arg0 = TreeSet(0), // 1 shrink
      arg1 = TreeSet() // 1 shrink
    )
Run completed in 452 milliseconds.
Total number of tests run: 1
Suites: completed 1, aborted 0
Tests: succeeded 0, failed 1, canceled 0, ignored 0, pending 0
*** 1 TEST FAILED ***
person raisercostin    schedule 15.03.2015

Для многих людей ответ рейзеркостина должен быть достаточно хорошим. Однако я видел некоторые проблемы, когда самые последние версии ScalaCheck и ScalaTest не полностью интегрированы, и, возможно, вам нужна какая-то новая функция.

Тем не менее, одна из приятных особенностей использования такого инструмента, как sbt, заключается в том, что вы можете запускать их одновременно. Это может быть не лучший способ сделать это, но вы можете иметь ваши тесты FlatSpec в одном файле и ваши ScalaCheck Props в другом, скажем, как SetsTest2 и SetsProps2.

Затем, когда вы запустите sbt test, он должен просто выполнить все ваши тесты и вернуться правильно! Чтобы проверить, я запустил преднамеренно ложный ScalaCheck Prop в небольшом приложении с 33 тестами FlatSpec и 2 ScalaCheck Prop и получил

[info] ScalaTest
[info] Run completed in 2 seconds, 211 milliseconds.
[info] Total number of tests run: 33
[info] Suites: completed 8, aborted 0
[info] Tests: succeeded 33, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[error] Failed: Total 35, Failed 1, Errors 0, Passed 34
[error] Failed tests:
[error]         com.xxx.xxx.TestProps
[error] (test:test) sbt.TestsFailedException: Tests unsuccessful 
person user3846506    schedule 12.04.2016