Как сообщить обо всех входных данных тестового набора для проверки свойства scalacheck.Prop.forAll?

При использовании scalacheck, если мы тестируем какое-либо свойство с помощью forAll, мы получаем только те сообщения о неудачных тестовых входах, которые не были пройдены, и ни один из них не прошел тестовые входные данные.

scala> import org.scalacheck.Prop.forAll 
scala> val propConcatLists = forAll { (l1: List[Int], l2: List[Int]) =>
                                        l1.size + l2.size == (l1 ::: l2).size }
scala> propConcatLists.check
 + OK, passed 100 tests.

Есть ли способ сообщить обо всех случайных тестовых входных данных, заданных forAll, соответствующему тесту свойств?

1 ответ

Решение

Использование collect,

Этот игрушечный пример иллюстрирует его использование:

import org.scalacheck.Prop.{forAll,collect}

val q = forAll { (m: Int, n: Int) => collect(m, n, m+n) { m + n != 37 } }
q.check

Приведенный выше код дает этот вывод

+ OK, passed 100 tests.
> Collected test data: 
2% (0,-1,-1)
2% (-1,0,-1)
2% (-1,2147483647,2147483646)
<snip>
1% (1,0,1)
1% (-1199549050,-1564573392,1530844854)
1% (2147483647,0,2147483647)
1% (-1,-2147483648,2147483647)

Отказ от ответственности: Этот игрушечный пример явно не является хорошо разработанным тестом свойств. Хотя это определенно не правда, что произвольная пара Ints никогда не подводит к 37 ScalaCheck потому что шансы двух произвольных Ints создано ScalaCheck суммирование до 37 чертовски мало. Но если значение 37 было изменено на любое из -2, -1, 0, 1 или 2, проверка, вероятно, не удалась бы, потому что значения -1, 0 и 1 генерируются непропорционально часто Scalacheck's неявный arbitrary[Int] генератор.

Другие вопросы по тегам