Wie bekomme ich ScalaChecks Arbitrary, um immer einige spezielle Case-Werte zu generieren?

8

Ich möchte, dass alle meine Eigenschaften immer mit mindestens einem festen Satz spezieller Werte zusätzlich zu einigen zufälligen Werten getestet werden. Ich möchte dies in meiner Generatorspezifikation definieren, nicht in jedem Test, der diesen Generatortyp verwendet. Wenn ich zum Beispiel Ints erzeuge, möchte ich, dass mein Generator immer mindestens 0, 1 und -1 für jeden Testfall generiert. Ist das möglich?

Das Beste, was ich mir bisher ausgedacht habe, ist, einen großen Generator zu erstellen, bei dem die kleinsten n Größen meinen n Sonderfällen entsprechen. Dies ist zumindest dann problematisch, weil alle möglichen Größen nicht getestet werden, wenn die maximale Anzahl der Tests so konfiguriert ist, dass sie niedriger als der Parameter für die maximale Größe ist.

    
mpartel 27.09.2011, 12:55
quelle

1 Antwort

17

Zunächst ist bereits eine Verzerrung in Scalacheck, so dass 0, 1, -1, Int.MaxValue und Int.MinValue sehr wahrscheinlich zusätzlich zu anderen Int ausgewählt werden. Werte. Also, wenn das deine Sorge ist, mach dir keine Sorgen darüber. Ebenso werden wahrscheinlich leere Strings generiert.

Wenn Sie dieses Verhalten jedoch für etwas anderes reproduzieren möchten, verwenden Sie Gen.oneOf oder Gen.frequency , möglicherweise in Verbindung mit Gen.choose . Da oneOf und frequency als Parameter Gen annehmen, können Sie Sonderfälle mit generischen Generatoren kombinieren.

Zum Beispiel:

%Vor%

Hat ziemlich genau das, wonach Sie gefragt haben, mit einer Wahrscheinlichkeit von 50% für willkürliche Ints (die mit der Voreingenommenheit, von der ich gesprochen habe, kommen) und 16,6% für jede von -1, 0 und 1.

    
Daniel C. Sobral 28.09.2011, 00:47
quelle

Tags und Links