Πώς να χρησιμοποιήσετε συνδυασμούς θέτει ως δεδομένα δοκιμών

ψήφοι
18

Θέλω να δοκιμάσει μια λειτουργία με μια πλειάδα από ένα σύνολο των περιπτώσεων περιθώριο και φυσιολογικές τιμές. Για παράδειγμα, κατά τη δοκιμή μια λειτουργία η οποία επιστρέφει trueόποτε δίνονται τρία μήκη που σχηματίζουν ένα έγκυρο τρίγωνο, θα έχουν συγκεκριμένες περιπτώσεις, αρνητική / μικρό / μεγάλους αριθμούς, τιμές κοντά-στο να ξεχειλίζει, κλπ .; επιπλέον, κύριος στόχος είναι να δημιουργήσει συνδυασμούς αυτών των αξιών, με ή χωρίς επανάληψη, προκειμένου να πάρει ένα σύνολο δεδομένων δοκιμής.

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

Ως ένα σημείωμα: Εγώ πραγματικά γνωρίζουν την απάντηση σε αυτό, αλλά θα μπορούσε να είναι χρήσιμο για τους άλλους, και μια πρόκληση για τους ανθρώπους εδώ! --will δημοσιεύσετε την απάντησή μου αργότερα.

Δημοσιεύθηκε 02/08/2008 στις 22:34
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
14

Απολύτως, ειδικά που ασχολούνται με πολλά από αυτά μεταθέσεις / συνδυασμούς που μπορεί σίγουρα να δείτε ότι το πρώτο πέρασμα θα είναι ένα ζήτημα.

Ενδιαφέρουσες εφαρμογή σε python, αν και έγραψα ένα ωραίο ένα σε C και OCaml με βάση την «Αλγόριθμος 515» (βλέπε παρακάτω). Αυτός του έγραψε σε Fortran όπως ήταν κοινή τότε για όλα τα έγγραφα «Αλγόριθμος XX», αλλά, αυτή τη συναρμολόγηση ή c. Έπρεπε να το ξαναγράψουν και να κάνει κάποιες μικρές βελτιώσεις να συνεργαστεί με όχι συστοιχίες σειρές αριθμών. Αυτό και μόνο κάνει τυχαίας προσπέλασης, είμαι εξακολουθεί να εργάζεται για να πάρει μερικά ωραία υλοποιήσεις αυτά που αναφέρονται στο Knuth δεμάτιο 4ο όγκο 2. εγώ θα επεξήγηση του πώς λειτουργεί αυτό στον αναγνώστη. Αν και αν κάποιος είναι περίεργος, εγώ δεν θα είχε αντίρρηση να γράφει κάτι επάνω.

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

~ «Αλγόριθμος 515: Δημιουργία ενός φορέα από την Λεξικογραφικές Index»? Πόρπες, BP και Lybanon, Μ ACM Transactions on Mathematical λογισμικού, Vol. 3, Νο 2, Ιούνιος του 1977.

Απαντήθηκε 03/08/2008 στις 20:06
πηγή χρήστη

ψήφοι
4

Με το ολοκαίνουργιο Python 2.6, έχετε ένα πρότυπο διάλυμα με τη μονάδα itertools που επιστρέφει το καρτεσιανό γινόμενο των 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)]

Μπορείτε να δώσετε ένα επιχείρημα «επανάληψη» για να εκτελέσει το προϊόν με iterable και η ίδια:

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

Μπορείτε επίσης να τσίμπημα κάτι με συνδυασμούς, καθώς και:

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

Και αν τα θέματα τάξης, υπάρχουν παραλλαγές:

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

Φυσικά όλα αυτά κρυώσουν τα πράγματα δεν ακριβώς κάνει το ίδιο πράγμα, αλλά μπορείτε να τα χρησιμοποιήσετε σε ένα ή τον άλλο τρόπο για να σας λύσει το πρόβλημα.

Απλά θυμηθείτε ότι μπορείτε να μετατρέψετε μια πλειάδα ή μια λίστα σε ένα σύνολο και αντίστροφα χρησιμοποιώντας κατάλογος (), πλειάδα () και ορίστε ().

Απαντήθηκε 04/10/2008 στις 09:52
πηγή χρήστη

ψήφοι
4

Ενδιαφέρουσα ερώτηση!

Θα ήθελα να το κάνετε αυτό, επιλέγοντας συνδυασμούς, κάτι σαν το παρακάτω σε python. Το πιο δύσκολο κομμάτι είναι πιθανώς η πρώτη επαλήθευση πέρασμα, δηλαδή if f(1,2,3) returns true, είναι ότι ένα σωστό αποτέλεσμα; Αφού έχετε διαπιστώσει ότι, τότε αυτό είναι μια καλή βάση για τη δοκιμή παλινδρόμησης.

Μάλλον είναι μια καλή ιδέα να κάνει μια σειρά περιπτώσεων δοκιμών που ξέρετε ότι θα είναι όλα αλήθεια (π.χ. 3,4,5 γι 'αυτή την υπόθεση τρίγωνο), και ένα σύνολο περιπτώσεων δοκιμών που ξέρετε ότι θα είναι όλα ψευδή (π.χ. 0,1 , iNF). Στη συνέχεια, μπορείτε πιο εύκολα να ελέγξει τα τεστ είναι σωστές.

# Xpermutations από http://code.activestate.com/recipes/190465
από xpermutations εισαγωγή *

μήκη = [- 1,0,1,5,10,0,1000, 'inf']
για c σε xselections (μήκη, 3): # ή xuniqueselections
    print γ
(-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)?
...
Απαντήθηκε 03/08/2008 στις 01:04
πηγή χρήστη

ψήφοι
2

Νομίζω ότι μπορείτε να το κάνετε αυτό με τη σειρά δοκιμών Χαρακτηριστικό (διατίθεται σε MbUnit και νεότερες εκδόσεις του NUnit), όπου μπορείτε να ορίσετε διάφορες ομάδες για να συμπληρώσετε μια δοκιμή μονάδα.

Απαντήθηκε 16/08/2008 στις 14:31
πηγή χρήστη

ψήφοι
0

Ενώ είναι δυνατόν να δημιουργηθούν πολλά δεδομένα δοκιμών και να δούμε τι θα συμβεί, είναι πιο αποτελεσματικό να προσπαθήσει να ελαχιστοποιήσει τα δεδομένα που χρησιμοποιούνται.

Από τυπική άποψη QA, θα θέλατε να εντοπίσει διάφορες ταξινομήσεις των εισροών. Δημιουργήστε ένα σύνολο τιμών εισόδου για κάθε ταξινόμηση και καθορίζει τις κατάλληλες εξόδους.

Εδώ είναι ένα δείγμα των κατηγοριών των τιμών των εισροών

  • έγκυρη τρίγωνα με μικρούς αριθμούς όπως (1 δισεκατομμύριο, 2, δισ, 2 δις)
  • έγκυρη τρίγωνα με μεγάλους αριθμούς όπως (0.000001, 0.00002, 0.00003)
  • έγκυρη αμβλεία τρίγωνα που είναι «almost'flat όπως (10, 10, 19,9999)
  • έγκυρη τρίγωνα οξεία που είναι «σχεδόν» επίπεδο, όπως η (10, 10, 0000001)
  • άκυρο τρίγωνα με τουλάχιστον μία αρνητική τιμή
  • άκυρο τρίγωνα, όπου το άθροισμα των δύο πλευρών είναι ίσο με το τρίτο
  • άκυρο τρίγωνα, όπου το άθροισμα των δύο πλευρών είναι μεγαλύτερη από την τρίτη
  • τιμές εισόδου που είναι μη-αριθμητικό

...

Μόλις είστε ικανοποιημένοι με τη λίστα των ταξινομήσεων εισόδου για αυτή τη λειτουργία, τότε μπορείτε να δημιουργήσετε τα πραγματικά δεδομένα των δοκιμών. Πιθανόν, θα ήταν χρήσιμο να δοκιμάσει όλες τις παραλλαγές του κάθε στοιχείου. (Π.χ. (2,3,4), (2,4,3), (3,2,4), (3,4,2), (4,2,3), (4,3,2)) συνήθως, θα βρείτε ότι υπάρχουν κάποιες ταξινομήσεις που χάσατε (όπως η έννοια της inf ως παράμετρο εισόδου).

Τυχαία δεδομένα για κάποιο χρονικό διάστημα μπορεί να είναι χρήσιμη, καθώς, το οποίο μπορεί να βρει περίεργο σφάλματα στον κώδικα, αλλά γενικά δεν είναι παραγωγική.

Πιο πιθανό, η λειτουργία αυτή χρησιμοποιείται σε κάποιο συγκεκριμένο πλαίσιο όπου εφαρμόζονται πρόσθετους κανόνες. (Π.χ. μόνο ακέραιες τιμές ή τιμές πρέπει να είναι σε 0,01 προσαυξήσεις, κλπ) Αυτά προστεθεί στον κατάλογο των ταξινομήσεων των παραμέτρων εισόδου.

Απαντήθηκε 17/09/2008 στις 04:15
πηγή χρήστη

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