Почему тест помечается как пройденный несмотря на неудачи


Я использую Scalatest/Scalacheck с пользовательскими генераторами. Я замечаю, что тесты помечаются как успешные, даже если некоторые тесты не удались. В приведенном ниже примере тест " должен добавить метку времени обработки" был фальсифицирован. И все же тест СБТ прошел.

+ OK, passed 100 tests.
[info] - should add product info to event 
[info] - should not alter rest of event
+ OK, passed 100 tests.
! Falsified after 0 passed tests.
> ARG_0: List("([B@27d10fe1,...)")
> ARG_0_ORIGINAL: List("([B@3c8057ce,...)")
[info] - should add processing timestamp
[info] ScalaTest
[info] Run completed in 4 seconds, 792 milliseconds.
[info] Total number of tests run: 3
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 3, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[info] Passed: Total 3, Failed 0, Errors 0, Passed 3
[success] Total time: 8 s, completed Sep 11, 2017 6:54:28 PM

Почему тест не проваливается??

Обновление: sbt 0.13, scalatest 3.0.1, scalacheck 1.13.4 и тестовый случай

  it should "add processing timestamp" in {
    Prop.forAll(sizedGen(TestInputGen.Generate)) { in => 
      val out = processor.input(in)

      out.forall(o => {
        val outTS = o._2.get("timestamps")
        (outTS.getModule() == "PrimaryProcessor")
      })
    }
  }.check
1 2

1 ответ:

Так как вы используете ScalaTest стиль тестирования на основе свойств, а не ScalaCheck стиль тестирования свойств, ваши свойства должны возвращать Matcher или Assertion вместо выражения Boolean.

Из документации :

В самом масштабируемом стиле свойств вы используете слово whenever вместо ==> и либо утверждение, либо выражение matcher вместо логического выражения

Ниже в примере вы можете использовать, чтобы проверить это. Тест проверяет, что длина 2 Соединенных строк всегда больше длины любой из строк, используемых в объединении. Это должно завершиться неудачей, когда обе строки пусты

Компилирует, но тесты проходят, потому что мы используем булево выражение

import org.scalatest.prop.PropertyChecks
import org.scalatest.{FlatSpec, Matchers}

final class StringSpec extends FlatSpec with Matchers with PropertyChecks {

  behavior of "String"

  it should "concatenate" in {
    forAll { (a: String, b: String) =>
      (a + b).length > a.length && (a + b).length > b.length
    }
  }
}

Компилируется и завершается неудачей, как и ожидалось, потому что он использует ' Matchers

import org.scalatest.prop.PropertyChecks
import org.scalatest.{Assertion, FlatSpec, Matchers}

final class StringSpec extends FlatSpec with Matchers with PropertyChecks {

  behavior of "String"

  it should "concatenate" in {
    forAll { (a: String, b: String) =>
      (a + b).length should be > a.length
      (a + b).length should be >= b.length
    }
  }
}