Wie Kombinationen von Sätzen als Testdaten verwenden,

stimmen
18

Ich möchte eine Funktion mit einem Tupel aus einer Reihe von Rand Fällen und normale Werte testen. Während zum Beispiel eine Funktion , die die Prüfung zurückgibt , truewenn gegeben drei Längen , die ein gültiges Dreieck bilden, würde ich bestimmte Fälle haben, negativ / kleinen / großen Nummern, Werte nahe zu überschwemmt zu werden, etc .; was mehr ist , Hauptziel ist es , Kombinationen dieser Werte zu erzeugen, mit oder ohne Wiederholung, um eine Reihe von Testdaten zu erhalten.

(inf,0,-1), (5,10,1000), (10,5,5), (0,-1,5), (1000,inf,inf),
...

Als Anmerkung: Ich weiß eigentlich die Antwort auf diese, aber es könnte für andere, und eine Herausforderung für die Menschen hier hilfreich sein! --will später auf meine Antwort posten.

Veröffentlicht am 02/08/2008 um 22:34
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
14

Absolut, vor allem mit vielen diesen Permutationen zu tun / Kombinationen kann ich auf jeden Fall sehen, dass der erste Durchlauf würde ein Problem sein.

Interessante Implementierung in Python, obwohl ich einen schönen einen in C und Ocaml basierend auf „Algorithm 515“ (siehe unten) schrieb. Er schrieb seine in Fortran als es üblich war damals für alle „Algorithm XX“ Papiere, na ja, diese Versammlung oder c. Ich musste es neu schreiben und einige kleine Verbesserungen mit Arrays nicht Bereiche von Zahlen zu arbeiten. Dies tut man wahlfreier Zugriff, ich arbeite noch ein paar schöne Implementierungen von denen in Knuth 4. Band Faszikel 2. Ich werde eine Erklärung, wie das funktioniert, dem Leser erwähnt auf zu bekommen. Obwohl, wenn jemand neugierig, würde das Objekt ich nicht etwas, bis zu schreiben.

/** [combination c n p x]
 * get the [x]th lexicographically ordered set of [p] elements in [n]
 * output is in [c], and should be sizeof(int)*[p] */
void combination(int* c,int n,int p, int x){
    int i,r,k = 0;
    for(i=0;i<p-1;i++){
        c[i] = (i != 0) ? c[i-1] : 0;
        do {
            c[i]++;
            r = choose(n-c[i],p-(i+1));
            k = k + r;
        } while(k < x);
        k = k - r;
    }
    c[p-1] = c[p-2] + x - k;
}

~ „Algorithm 515: Erzeugung eines Vektors aus dem Lexikographische Index“; Schnallen, BP und Lybanon, M. ACM Transactions on Mathematical Software, Vol. 3, No. 2, Juni 1977.

Beantwortet am 03/08/2008 um 20:06
quelle vom benutzer

stimmen
4

Mit dem brandneuen Python 2.6, haben Sie eine Standardlösung mit dem itertools Modul, das das kartesische Produkt Iterables zurückgibt:

import itertools

print list(itertools.product([1,2,3], [4,5,6]))
   [(1, 4), (1, 5), (1, 6),
   (2, 4), (2, 5), (2, 6),
   (3, 4), (3, 5), (3, 6)]

Sie können eine „repeat“ Argument liefern ein Produkt mit einem iterable auszuführen und sich selbst:

print list(itertools.product([1,2], repeat=3))
[(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),
(2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]

Sie können auch auch etwas mit Kombinationen zwicken:

print list(itertools.combinations('123', 2))
[('1', '2'), ('1', '3'), ('2', '3')]

Und wenn um Fragen gibt es Permutationen:

print list(itertools.permutations([1,2,3,4], 2))
[(1, 2), (1, 3), (1, 4),
   (2, 1), (2, 3), (2, 4),
   (3, 1), (3, 2), (3, 4),
   (4, 1), (4, 2), (4, 3)]

Natürlich alles, was Hamlish nicht genau das gleiche tun, aber man kann sie in einer Weise verwenden oder eine andere Sie Problem zu lösen.

Denken Sie daran, dass Sie ein Tupel oder eine Liste in einen Satz konvertieren und umgekehrt Liste mit (), Tupel () und () gesetzt.

Beantwortet am 04/10/2008 um 09:52
quelle vom benutzer

stimmen
4

Interessante Frage!

Ich würde dies tun , indem Kombinationen, so etwas wie die folgenden in Python Kommissionierung. Der schwierigste Teil ist wahrscheinlich erste Pass Überprüfung, das heißt if f(1,2,3) returns true, ist , dass ein korrektes Ergebnis? Sobald Sie das überprüft haben, dann ist dies eine gute Basis für Regressionstests.

Wahrscheinlich ist es eine gute Idee, eine Reihe von Testfällen zu machen, die Sie wissen, wird alles wahr (zB 3,4,5 für dieses Dreieck Fall) sein, und eine Reihe von Testfällen, die Sie wissen, dass alle falsch sein (zB 0,1 , inf). Dann können Sie überprüfen, leicht die Tests korrekt sind.

# Xpermutations von http://code.activestate.com/recipes/190465
von xpermutations importieren *

Längen = [- 1,0,1,5,10,0,1000, 'inf']
für C in xselections (Längen, 3): # oder xuniqueselections
    Druck c
(-1, -1, -1);
(-1, -1,0);
(-1, -1,1);
(-1, -1,5);
(-1, -1,10);
(-1, -1,0);
(-1, -1,1000);
(-1, -1, inf);
(-1,0, -1);
(-1,0,0);
...
Beantwortet am 03/08/2008 um 01:04
quelle vom benutzer

stimmen
2

Ich glaube , Sie können dies tun , mit dem Row - Test Attribute (erhältlich in MbUnit und späteren Versionen von NUnit) , wo man mehrere Sätze füllen eine Einheit Test angeben kann.

Beantwortet am 16/08/2008 um 14:31
quelle vom benutzer

stimmen
0

Während es möglich ist, viele Testdaten zu erstellen und sehen, was passiert, ist es effizienter, um zu versuchen, die Daten verwendet werden, zu minimieren.

Von einer typischen QA Perspektive würden Sie unterschiedliche Klassifikationen von Eingaben zu identifizieren. Produzieren eines Satzes von Eingabewerte für jede Klassifikation und bestimmen, die entsprechenden Ausgänge.

Hier ist ein Beispiel von Klassen von Eingabewerten

  • gültige Dreiecken mit geringen Stückzahlen, wie beispielsweise (1 Milliarde, 2, Milliarden, 2 Milliarden)
  • gültige Dreiecken mit großen Stückzahlen, wie beispielsweise (0.000001, 0.00002, 0.00003)
  • gültig stumpfe Dreiecken, die ‚almost'flat wie (10, 10, 19,9999) sind
  • gültige acute Dreiecke, die ‚fast‘ flach wie (10, 10, 0000001) sind
  • invalid Dreiecken mit mindestens einem negativen Wert
  • ungültige Dreiecke, wobei die Summe von zwei Seiten die dritte ist gleich
  • invalid Dreiecke, wobei die Summe der zwei Seiten größer ist als der dritte
  • Eingabewerte, die nicht numerisch sind

...

Sobald Sie mit der Liste der Eingabe Klassifizierungen für diese Funktion erfüllt sind, dann können Sie die aktuellen Testdaten erstellen. Wahrscheinlich wäre es hilfreich, alle Permutationen der einzelnen Elemente zu testen. (ZB (2,3,4), (2,4,3), (3,2,4), (3,4,2), (4,2,3), (4,3,2)) typischerweise werden Sie feststellen, es gibt einige Klassifikationen Sie (wie das Konzept der inf als Eingabeparameter) verpasst.

Zufallsdaten für einen gewissen Zeitraum kann hilfreich sein, als auch, dass seltsame Fehler im Code finden kann, aber in der Regel nicht produktiv.

Diese Artikel auf die Liste der Einstufungen der Eingangsparameter wahrscheinlicher ist, wird diese Funktion in einem spezifischen Kontext, in den zusätzlichen Regeln angewandt werden, verwendet wird. (ZB nur ganzzahlige Werte oder Werte in Schritten von 0,01 sein muss, etc.).

Beantwortet am 17/09/2008 um 04:15
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more