Frage

Ich möchte eine Funktion mit einem Tupel aus einer Reihe von Randfällen und Normalwerten testen.Zum Beispiel beim Testen einer Funktion, die zurückkehrt true Wann immer drei Längen gegeben sind, die ein gültiges Dreieck bilden, hätte ich bestimmte Fälle, negative/kleine/große Zahlen, Werte, die kurz vor dem Überlauf stehen usw.;Darüber hinaus besteht das Hauptziel darin, Kombinationen dieser Werte zu erzeugen. mit oder ohne Wiederholung, um einen Satz Testdaten zu erhalten.

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

Als Anmerkung:Eigentlich kenne ich die Antwort darauf, aber sie könnte für andere hilfreich sein und für die Leute hier eine Herausforderung darstellen!--werde meine Antwort später posten.

War es hilfreich?

Lösung

Absolut, insbesondere wenn ich mich mit vielen dieser Permutationen/Kombinationen beschäftige, kann ich definitiv erkennen, dass der erste Durchgang ein Problem sein würde.

Interessante Implementierung in Python, obwohl ich eine schöne in C und Ocaml basierend auf „Algorithmus 515“ geschrieben habe (siehe unten).Er schrieb seine in Fortran, wie es damals für alle „Algorithmus XX“-Aufsätze üblich war, also diese Versammlung oder c.Ich musste es neu schreiben und einige kleine Verbesserungen vornehmen, um mit Arrays und nicht mit Zahlenbereichen zu arbeiten.Dieser ermöglicht den Direktzugriff. Ich arbeite immer noch daran, einige schöne Implementierungen der in Knuths 4. Band Faszikel 2 erwähnten zu erhalten.Ich werde dem Leser erklären, wie das funktioniert.Aber wenn jemand neugierig ist, hätte ich nichts dagegen, etwas aufzuschreiben.

/** [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;
}

~"Algorithmus 515:Generierung eines Vektors aus dem Lexikographischen Index“;Schnallen, B.P. und Lybanon, M.ACM Transactions on Mathematical Software, Bd.3, Nein.2. Juni 1977.

Andere Tipps

Mit dem brandneuen Python 2.6 steht Ihnen mit dem Modul itertools eine Standardlösung zur Verfügung, die das kartesische Produkt von 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 ein „repeat“-Argument angeben, um das Produkt mit einem Iterable und sich selbst auszuführen:

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 mit Kombinationen etwas optimieren:

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

Und wenn es auf die Reihenfolge ankommt, 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 bewirken all diese coolen Dinge nicht genau das Gleiche, aber Sie können sie auf die eine oder andere Weise verwenden, um Ihr Problem zu lösen.

Denken Sie daran, dass Sie mit list(), tuple() und set() ein Tupel oder eine Liste in eine Menge umwandeln können und umgekehrt.

Interessante Frage!

Ich würde dies tun, indem ich Kombinationen auswähle, etwa die folgenden in Python.Der schwierigste Teil ist wahrscheinlich die Verifizierung beim ersten Durchgang, d. h. if f(1,2,3) returns true, ist das ein korrektes Ergebnis?Sobald Sie dies überprüft haben, ist dies eine gute Grundlage für Regressionstests.

Wahrscheinlich ist es eine gute Idee, eine Reihe von Testfällen zu erstellen, von denen Sie wissen, dass sie alle wahr sind (z. B.3,4,5 für diesen Dreiecksfall) und eine Reihe von Testfällen, von denen Sie wissen, dass sie alle falsch sind (z. B.0,1,inf).Dann können Sie einfacher überprüfen, ob die Tests korrekt sind.

# xpermutations from http://code.activestate.com/recipes/190465
from xpermutations import *

lengths=[-1,0,1,5,10,0,1000,'inf']
for c in xselections(lengths,3):        # or xuniqueselections
    print 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);
...

Ich denke, dass man das mit dem machen kann Zeilentestattribut (verfügbar in MbUnit und späteren Versionen von NUnit), wo Sie mehrere Sätze angeben können, um einen Komponententest zu füllen.

Obwohl es möglich ist, viele Testdaten zu erstellen und zu sehen, was passiert, ist es effizienter, zu versuchen, die verwendeten Daten zu minimieren.

Aus typischer QS-Perspektive möchten Sie unterschiedliche Klassifizierungen von Eingaben identifizieren.Erstellen Sie einen Satz Eingabewerte für jede Klassifizierung und bestimmen Sie die entsprechenden Ausgaben.

Hier ist ein Beispiel für Klassen von Eingabewerten

  • gültige Dreiecke mit kleinen Zahlen wie (1 Milliarde, 2, Milliarde, 2 Milliarden)
  • gültige Dreiecke mit großen Zahlen wie (0,000001, 0,00002, 0,00003)
  • gültige stumpfe Dreiecke, die „fast“ flach sind, wie (10, 10, 19,9999)
  • gültige spitze Dreiecke, die „fast“ flach sind, wie zum Beispiel (10, 10, 0000001)
  • Ungültige Dreiecke mit mindestens einem negativen Wert
  • ungültige Dreiecke, bei denen die Summe zweier Seiten gleich der dritten ist
  • Ungültige Dreiecke, bei denen die Summe zweier Seiten größer als die dritte ist
  • Eingabewerte, die nicht numerisch sind

...

Sobald Sie mit der Liste der Eingabeklassifizierungen für diese Funktion zufrieden sind, können Sie die tatsächlichen Testdaten erstellen.Wahrscheinlich wäre es hilfreich, alle Permutationen jedes Elements zu testen.(z.B.(2,3,4), (2,4,3), (3,2,4), (3,4,2), (4,2,3), (4,3,2)) Typischerweise: Sie werden feststellen, dass es einige Klassifizierungen gibt, die Sie übersehen haben (z. B. das Konzept von inf als Eingabeparameter).

Zufällige Daten über einen bestimmten Zeitraum können ebenfalls hilfreich sein, da sie seltsame Fehler im Code finden können, aber im Allgemeinen nicht produktiv sind.

Wahrscheinlicher ist, dass diese Funktion in einem bestimmten Kontext verwendet wird, in dem zusätzliche Regeln angewendet werden (z. B.nur ganzzahlige Werte oder Werte müssen in Schritten von 0,01 vorliegen usw.) Diese ergänzen die Liste der Klassifizierungen von Eingabeparametern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top