qc är ett testverktyg som låter dig skriva egenskaper som du förväntar dig att hålla sant, och låt datorn genererar randomiserade testfall för att kontrollera att dessa egenskaper faktiskt håller. & Nbsp; Till exempel, om du har skrivit komprimera och dekomprimera funktioner för vissa uppgifter komprimeringsprogram, är en självklar egenskap för test som komprimering och dekomprimering en sträng ger tillbaka den ursprungliga strängen. Här är hur du kan uttrycka att:
import unittest
import qc
klass TestCompression (unittest.TestCase):
& Nbsp; @ qc.property
& Nbsp; def test_compress_decompress (själv):
& Nbsp; "" ". Testa att komprimera och dekomprimera avkastning originaldata" ""
& Nbsp; information = qc.str () # En godtycklig sträng. Värden är randomiserade.
& Nbsp; self.assertEqual (data, packa (komprimera (data)), repr (data))
Det är en vanlig test med Pythons inbyggda unittest ram (vilket är varför det finns så mycket standardtext). Alternativt kan du göra exakt samma sak med en annan ram testning, liksom minimalt mångordig, ganska trevlig näsa. Den @ qc.property dekoratör kör dekorerade funktionen flera gånger, och varje gång de värden som returneras av funktioner som qc.string () är olika. Med andra ord, är Quick kompatibel med ganska mycket varje prov ram ute enhet; det är inte särskilt krävande.
Funktioner som qc.str (), qc.int (), och så vidare, genererar godtyckliga värden av en viss typ. I exemplet ovan, vi hävdar att fastigheten gäller för alla strängar. När du kör testerna kommer Quick generera randomiserade strängar för testning.
Du kommer att märka att jag sa "randomiserad", inte "random". Detta är avsiktligt. Fördelningen av värden tweaked att inkludera intressanta värden, som tomma strängar eller strängar med NUL-tecken i mitten, eller strängar som innehåller engelsk text. I allmänhet försöker Quick för att ge en bra blandning av smarta knepiga värden och slumpmässighet. Detta är i huvudsak vad du skulle göra om du var tvungen att skriva riktigt noggranna testfall för hand, förutom att du inte behöver göra det. I praktiken har datorn färre förutfattade meningar om vad som utgör sane uppgifter, så det kommer ofta att hitta buggar som aldrig skulle ha inträffat till dig att skriva testfall för. Det vet inte hur man omedvetet undviker buggar.
Du är inte begränsad till de inbyggda godtyckliga värdefunktioner. Du kan använda dem som byggstenar för att skapa din egen. Till exempel:
klassen Point (objekt):
& Nbsp; def __init __ (self, x, y):
& Nbsp; self.x, self.y = float (x), float (y)
def punkten ():
& Nbsp; "" "Get en godtycklig punkt." ""
& Nbsp; x = qc.int (-20, 20)
& Nbsp; y = qc.int (-34, 50)
& Nbsp; återvända Point (x, y)
Du kan sedan använda detta för att generera godtyckliga punktvärden i fastigheter. Här är en näsa-stil test:
@ Qc.property
def test_triangle_inequality ():
& Nbsp; pt = punkten ()
& Nbsp; hävda abs (pt.x) + abs (pt.y)> = math.sqrt (pt.x ** 2 + pt.y ** 2), (pt.x, pt.y)
När du kör det här, något magiskt händer: Quick kommer att försöka generera knepiga värden för både x och y variabler i klassen Point, tillsammans, så att du får se punkter som (0, 0), (1, 1), ( 0, 1), (385.904, 0), samt helt slump uppstickare som (584, -35.809.648). Med andra ord, i stället för att bara dra x- och y-värden från en ström av slumptal med några knepiga värden i den, Quick faktiskt kommer att försöka generera svåra kombinationer av x- och y-koordinater.
Funktioner för att få godtyckliga data strong>
- Int (låg, hög) ger ints, mellan de valfria gränser låga och höga.
- Långa (låg, hög) ger längtar, mellan de valfria gränser låga och höga.
- Float (låg, hög) ger flöten, mellan de valfria gränser låga och höga. Inga Infinities eller NaN värden.
& Nbsp; str (längd = Ingen, MaxLen = None) ger strängar, av typen str. Kodningen är UTF-8. Om längden ges kommer strängarna att vara exakt så länge. Om MaxLen ges kommer strängen längden vara mest MaxLen tecken.
- Unicode (längd = Ingen, MaxLen = None) ger unicode strängar, av typen unicode. Om längden ges kommer strängarna att vara exakt så länge. Om MaxLen ges kommer strängen längden vara mest MaxLen tecken.
- Namnet () ger namn, i Unicode. Dessa sträcker sig från den prosaiska, som "John Smith", till de exotiska - namn som innehåller icke-brytande mellanslag, eller e-postadresser, eller Unicode-tecken utanför Basic Multilingual Plane. Detta är, om något, mindre perverst än namnen kommer du att se i en tillräckligt stor mängd internetuppgifter.
- NameUtf8 () är samma som namn () koda ('utf8')..
- FromList (objekt) returnerar slumpmässiga objekt från en lista. Detta är främst användbart för att skapa dina egna godtyckliga data generator funktioner.
- Randstr (längd = Ingen, MaxLen = sys.maxint) ger strängar av slumpmässiga byte. Om längden ges kommer strängarna att vara exakt så länge. Om MaxLen ges kommer stränglängden vara högst MaxLen bytes.
Strängarna produceras av str och unicode är randomiserade, men vissa ansträngningar har lagts på att göra dem tillräckligt perverst att avslöja fel i en hel massa strängbearbetning kod. Namnet Listan är löst baserad på hemska minnen av att ha sett namnet processkod krasch på verkliga data, om och om och om igen, som det blev allt mer uppenbart att världen är galen, och vi verkligen dömda. (Denna känsla går när du får tillräckligt med testtäckning och ting äntligen sluta krascha. Det finns hopp!)
De namn och strängexempeldata i qc.arbitrary kan vara intressant som en källa för mera deteministic provfalldata. Känn dig fri att låna något av det. De interna är magisk, men de magiska inre delarna, de mest intressanta är i qc.arbitrary och qc
Krav :.
- Python
Kommentarer hittades inte