2011-09-27 7 views
8

Mi piacerebbe avere tutte le mie proprietà sempre testate con almeno un set fisso di valori speciali oltre ad alcuni valori casuali. Mi piacerebbe definire questo nella mia specifica generatore, non in ogni test che utilizza quel tipo di generatore. Ad esempio, se stavo generando Ints, vorrei che il mio generatore generasse sempre almeno 0, 1 e -1 per ogni caso di test. È possibile?Come ottenere Arbitrary di ScalaCheck per generare sempre alcuni valori del caso speciale?

Il migliore che è venuta in mente finora è quello di fare un generatore di dimensioni in cui i più piccoli n dimensioni corrispondono ai miei n casi particolari. Questo è problematico, almeno perché tutte le dimensioni possibili non sono testate quando il numero massimo di test è configurato per essere inferiore al parametro max size.

risposta

17

Innanzitutto, c'è già è una polarizzazione in modo che ScalaCheck 0, 1, -1, Int.MaxValue e Int.MinValue sono molto suscettibili di essere scelto in aggiunta ad altri Int valori. Quindi, se questa è la tua preoccupazione, non ti preoccupare. Allo stesso modo, è probabile che vengano generate stringhe vuote.

Ma, se si desidera riprodurre questo comportamento per qualcos'altro, utilizzare Gen.oneOf o Gen.frequency, forse in combinazione con Gen.choose. Poiché oneOf e frequency prendono come parametro Gen, è possibile combinare casi speciali con generatori generici.

Ad esempio:

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

fa più o meno quello che hai chiesto, con il 50% di possibilità di interi arbitrari (che verrà con il bias ho parlato), e il 16,6% per ciascuno di -1, 0 e 1.

+0

Ok, immagino che mi accontenterò molto probabilmente. Grazie per una risposta approfondita! In realtà sto generando espressioni booleane tra due. – mpartel

Problemi correlati