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

Я использую 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

person Cheeko    schedule 11.09.2017    source источник
comment
Тест провален. Задача удаётся.   -  person pedromss    schedule 12.09.2017
comment
[информация] Тесты: успешны 3, неудачны 0, отменены 0, проигнорированы 0, ожидаются 0 --- Неудачный тест равен 0.   -  person Cheeko    schedule 13.09.2017
comment
Ok. Можете ли вы предоставить тест, который не работает, но проходит? Команда, которую вы использовали для запуска (я полагаю, sbt test), а также версии sbt и scalatest.   -  person pedromss    schedule 13.09.2017
comment
Я обновил пост с информацией, которую вы просили. Да, я запускаю sbt test или testOnly.   -  person Cheeko    schedule 14.09.2017


Ответы (1)


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

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

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

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

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

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
    }
  }
}
person pedromss    schedule 24.09.2017
comment
Спасибо за ваш ответ. Хотя это в правильном направлении, я обнаружил, что более точный ответ уже был дан в другом вопросе SO. Я отметил это как дубликат другого вопроса SO. - person Cheeko; 12.10.2017
comment
stackoverflow .com/questions/29059484/ - person Cheeko; 12.10.2017