Vra

Ek wil graag 'n funksie met 'n tupel uit 'n stel byvoordele en normale waardes toets.Byvoorbeeld, terwyl u 'n funksie toets wat terugkeer true wanneer ek ook al drie lengtes gegee het wat 'n geldige driehoek vorm, sal ek spesifieke gevalle hê, negatiewe / klein / groot getalle, waardes wat naby aan oorloop is, ens.;wat meer is, hoofdoel is om kombinasies van hierdie waardes te genereer, met of sonder herhaling, om 'n stel toetsdata te kry.

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

As 'n nota:Ek ken eintlik die antwoord hierop, maar dit kan dalk nuttig wees vir ander, en 'n uitdaging vir mense hier!--sal my antwoord later plaas.

Was dit nuttig?

Oplossing

Absoluut, veral met baie van hierdie permutasies/kombinasies, kan ek beslis sien dat die eerste pas 'n probleem sou wees.

Interessante implementering in python, alhoewel ek 'n mooi een in C en Ocaml geskryf het gebaseer op "Algorithm 515" (sien hieronder).Hy het syne in Fortran geskryf, aangesien dit destyds algemeen was vir al die "Algorithm XX" vraestelle, wel, daardie vergadering of c.Ek moes dit herskryf en 'n paar klein verbeterings aanbring om met skikkings te werk, nie reekse van getalle nie.Hierdie een het ewekansige toegang, ek werk nog daaraan om 'n paar goeie implementerings te kry van die wat in Knuth 4de volume fascicle 2 genoem word.Ek sal 'n verduideliking van hoe dit werk aan die leser.Maar as iemand nuuskierig is, sal ek nie beswaar maak om iets op te skryf nie.

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

~"Algorithme 515:Generasie van 'n vektor uit die leksikografiese indeks";Gespe, B.P., en Lybanon, M.ACM Transactions on Mathematical Software, Vol.3, nr.2 Junie 1977.

Ander wenke

Met die splinternuwe Python 2.6 het jy 'n standaardoplossing met die itertools-module wat die Cartesiese produk van iterables terugstuur:

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

Jy kan 'n "herhaal" argument verskaf om die produk uit te voer met 'n herhaalbare en homself:

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

Jy kan ook iets met kombinasies aanpas:

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

En as volgorde saak maak, is daar permutasies:

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

Natuurlik doen al daardie oulike goed nie presies dieselfde nie, maar jy kan dit op een of ander manier gebruik om jou probleem op te los.

Onthou net dat jy 'n tuple of 'n lys na 'n stel kan omskep en omgekeerd met behulp van list(), tuple() en set().

Interessante vraag!

Ek sal dit doen deur kombinasies te kies, iets soos die volgende in luislang.Die moeilikste deel is waarskynlik eerste slaag verifikasie, m.a.w. if f(1,2,3) returns true, is dit 'n korrekte resultaat?Sodra jy dit geverifieer het, dan is dit 'n goeie basis vir regressietoetsing.

Dit is waarskynlik 'n goeie idee om 'n stel toetsgevalle te maak wat jy weet almal waar sal wees (bv.3,4,5 vir hierdie driehoekgeval), en 'n stel toetsgevalle wat jy weet almal vals sal wees (bv.0,1,inf).Dan kan jy makliker verifieer dat die toetse korrek is.

# 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);
...

Ek dink jy kan dit doen met die Rytoetskenmerk (beskikbaar in MbUnit en later weergawes van NUnit) waar jy verskeie stelle kan spesifiseer om een ​​eenheidstoets te vul.

Alhoewel dit moontlik is om baie toetsdata te skep en te sien wat gebeur, is dit meer doeltreffend om te probeer om die data wat gebruik word te minimaliseer.

Vanuit 'n tipiese QA-perspektief sal jy verskillende klassifikasies van insette wil identifiseer.Produseer 'n stel insetwaardes vir elke klassifikasie en bepaal die toepaslike uitsette.

Hier is 'n voorbeeld van klasse insetwaardes

  • geldige driehoeke met klein getalle soos (1 biljoen, 2, biljoen, 2 biljoen)
  • geldige driehoeke met groot getalle soos (0,000001, 0,00002, 0,00003)
  • geldige stomp driehoeke wat 'amper' plat is soos (10, 10, 19.9999)
  • geldige skerp driehoeke wat 'amper' plat is, soos (10, 10, 0000001)
  • ongeldige driehoeke met ten minste een negatiewe waarde
  • ongeldige driehoeke waar die som van twee sye gelyk is aan die derde
  • ongeldige driehoeke waar die som van twee sye groter is as die derde
  • invoerwaardes wat nie-numeries is

...

Sodra jy tevrede is met die lys van invoerklassifikasies vir hierdie funksie, kan jy die werklike toetsdata skep.Dit sal waarskynlik nuttig wees om alle permutasies van elke item te toets.(bv.(2,3,4), (2,4,3), (3,2,4), (3,4,2), (4,2,3), (4,3,2)) Tipies, jy sal vind daar is 'n paar klassifikasies wat jy gemis het (soos die konsep van inf as 'n invoerparameter).

Willekeurige data vir 'n geruime tyd kan ook nuttig wees, wat vreemde foute in die kode kan vind, maar is oor die algemeen nie produktief nie.

Meer waarskynlik, hierdie funksie word gebruik in een of ander spesifieke konteks waar bykomende reëls toegepas word.(bv.slegs heelgetalwaardes of waardes moet in 0.01 inkremente wees, ens.) Dit voeg by die lys van klassifikasies van invoerparameters.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top