Jak stosować kombinacje zestawów danych testowych jak

głosy
18

Chciałbym przetestować funkcję z krotki z zestawu przypadkach skrajnych i normalnych wartości. Na przykład, podczas testowania funkcji, która zwraca truegdy podawane trzy odcinki, które stanowią ważny trójkąta, muszę szczególnych przypadkach, ujemne / małych / dużych ilościach, na wartości blisko-jest przepełnienie, itp .; Co więcej, głównym celem jest generowanie kombinacji tych wartości, z lub bez powtórzeń, aby uzyskać zestaw danych testowych.

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

Na marginesie: I rzeczywiście zna odpowiedź na to pytanie, ale może to być pomocne dla innych, a wyzwaniem dla ludzi tutaj! --will pisać moją odpowiedź później.

Utwórz 02/08/2008 o 22:34
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
4

Interesujące pytanie!

Chciałbym to zrobić poprzez wybranie kombinacji, coś jak poniżej w Pythonie. Najtrudniej jest chyba weryfikacja Pierwszy przebieg, czyli if f(1,2,3) returns trueto, że prawidłowy wynik? Po upewnieniu się, że to jest to dobra podstawa do testów regresji.

Prawdopodobnie jest to dobry pomysł, aby zbiór przypadków testowych, które znasz będzie wszystko prawda (np 3,4,5 tym przypadku trójkąt), a zbiór przypadków testowych, które znasz będzie fałszywe (np 0,1 , iNF). Następnie można łatwo zweryfikować więcej testów są prawidłowe.

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

Długości = [- 1,0,1,5,10,0,1000 'inf']
dla C w xselections (długość 3) # lub xuniqueselections
    drukuj 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);
...
Odpowiedział 03/08/2008 o 01:04
źródło użytkownik

głosy
14

Oczywiście, przede wszystkim do czynienia z dużą ilością tych permutacji / kombinacje ja na pewno może zobaczyć, że pierwsze przejście byłoby problemem.

Interesująca implementacja w Pythonie, chociaż napisałem piękny jeden w C i SML algorytmu opartego na „515” (patrz niżej). Napisał w Fortran, jak to było wtedy wspólny dla wszystkich „Algorytm xx” papierach, dobrze, że montaż lub c. Musiałem ponownie zapisać go i zrobić kilka małych ulepszeń do pracy z tablicami nie zakresy liczb. Ten apartament ma swobodny dostęp, wciąż pracuję na uzyskanie kilka ciekawych implementacje wymienionymi w Knuth 4-cie głośności tomie 2. Będę wyjaśnienie jak to działa na czytelnika. Chociaż jeśli ktoś jest ciekawy, nie będzie sprzeciwiał się pisać coś.

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

~ „Algorytm 515: Wytwarzanie wektora z leksykograficznej Index”; Klamry, BP, i Lybanon, M. ACM Transactions on Mathematical Software, Vol. 3, nr 2, czerwiec 1977 r.

Odpowiedział 03/08/2008 o 20:06
źródło użytkownik

głosy
2

Myślę, że można to zrobić za pomocą atrybutu testowym Row (dostępne w MbUnit i nowszych wersjach NUnit), gdzie można określić kilka zestawów do wypełnienia jednej badanej jednostki.

Odpowiedział 16/08/2008 o 14:31
źródło użytkownik

głosy
0

O ile to możliwe, aby stworzyć wiele danych testowych i zobaczyć co się dzieje, to jest bardziej wydajny, aby spróbować zminimalizować używane dane.

Z punktu widzenia typowego QA, co chcesz, aby zidentyfikować różne klasyfikacje wejść. Wytworzyć zbiór wartości wejściowych dla każdej klasyfikacji i określenie odpowiednich wyjść.

Oto próbka klas wartości wejściowych

  • ważne trójkąty małych ilościach, takich jak kwas (1000000000, 2 miliardów 2000000000)
  • ważne trójkąty dużych ilościach, takich jak (0.000001, 0,00002, 0,00003)
  • ważne trójkąty rozwarty, który jest „taki jak almost'flat (10, 10, 19,9999)
  • ważne trójkąty ostre, które są „prawie” płaski, taki jak (10, 10 0000001)
  • Nieprawidłowe trójkąty, z co najmniej jedną wartością ujemną
  • Nieprawidłowe trójkąty gdzie suma dwóch boków równa się trzeciemu
  • Nieprawidłowe trójkąty gdzie suma dwóch boków jest większa niż trzeci
  • wartości wejściowe, które nie są numeryczny

...

Gdy jesteś zadowolony z wykazu klasyfikacji wejściowych dla tej funkcji, można tworzyć rzeczywiste dane testowe. Prawdopodobnie byłoby pomocne w celu sprawdzenia wszystkich permutacji każdej pozycji. (Przykład (2,3,4), (2,4,3), (3,2,4), (3,4,2), (4,2,3), (4,3,2)) zazwyczaj znajdziesz istnieją pewne klasyfikacje Przegapiłeś (takie jak pojęcie inf jako parametru wejściowego).

Losowe dane za pewien okres czasu może być pomocne, jak również, które mogą znaleźć się dziwne błędy w kodzie, ale generalnie nie jest wydajne.

Bardziej prawdopodobne, że funkcja ta jest wykorzystywana w pewnym określonym kontekście, gdzie stosowane są dodatkowe przepisy. (Np tylko wartości całkowite lub wartości muszą być w krokach co 0,01, itd.) Te dodać do wykazu klasyfikacji parametrów wejściowych.

Odpowiedział 17/09/2008 o 04:15
źródło użytkownik

głosy
4

Ze nowy Python 2.6, masz standardowe rozwiązanie z modułem itertools które zwraca iloczyn kartezjański iterables:

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)]

można podać „Repeat” argument, aby wykonać produkt o iterable i sama:

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)]

Można również dostosować coś z kombinacji, a także:

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

A jeśli sprawach porządkowych, istnieją permutacje:

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)]

Oczywiście wszystko to fajne rzeczy nie dokładnie to samo, ale można ich używać w taki czy inny sposób rozwiązać Ci problem.

Wystarczy pamiętać, że można przekonwertować krotki lub listy do zestawu i odwrotnie za pomocą listy (), krotka () i set ().

Odpowiedział 04/10/2008 o 09:52
źródło użytkownik

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