2011-09-27 11 views
8

Chciałbym, aby wszystkie moje właściwości były zawsze testowane z co najmniej stałym zestawem wartości specjalnych oprócz niektórych losowych wartości. Chciałbym to zdefiniować w mojej specyfikacji generatora, a nie w każdym teście stosującym ten typ generatora. Na przykład, jeśli generowałem Ints, chciałbym, aby mój generator generował zawsze co najmniej 0, 1 i -1 dla każdego przypadku testowego. czy to możliwe?Jak uzyskać arbitralne ScalaCheck, aby zawsze generować specjalne wartości wielkości liter?

Najlepszym Mam wymyślić tak daleko jest, aby wielkości generator gdzie najmniejsze n rozmiary odpowiadają moich n szczególnych przypadkach. Jest to problematyczne, przynajmniej dlatego, że wszystkie możliwe rozmiary nie są testowane, gdy maksymalna liczba testów jest skonfigurowana jako mniejsza niż parametr maksymalnego rozmiaru.

Odpowiedz

17

Przede wszystkim, nie jest już ukierunkowania Scalacheck tak, 0, 1, 1, Int.MaxValue i Int.MinValue bardzo prawdopodobne wybrane oprócz innych wartości Int. Tak więc, jeśli to twoje zmartwienie, nie martw się o to. Podobnie najprawdopodobniej wygenerowane zostaną puste ciągi.

Ale jeśli chcesz odtworzyć to zachowanie dla czegoś innego, użyj Gen.oneOf lub Gen.frequency, być może w połączeniu z Gen.choose. Ponieważ oneOf i frequency jako parametr przyjmują Gen, można łączyć specjalne przypadki z generatorami generycznymi.

Na przykład:

val myArb: Arbitrary[Int] = Arbitrary(Gen.frequency(
    1 -> -1, 
    1 -> 0, 
    1 -> 1, 
    3 -> Arbitrary.arbInt.arbitrary 
)) 

działa dość dużo, co prosiłeś, z 50% szansą arbitralnych wskazówki (co przyjdzie z uprzedzeń mówiłem) i 16,6% dla każdej z -1, 0 i 1.

+0

Ok, chyba załatwię bardzo prawdopodobne. Dzięki za dokładną odpowiedź! Właściwie generuję wyrażeń binarnych. – mpartel

Powiązane problemy