QC is een testing tool waarmee je schrijft eigenschappen die je verwacht te kloppen, en laat de computer genereren gerandomiseerde testcases om te controleren dat deze eigenschappen eigenlijk houd & nbsp;. Bijvoorbeeld, als u hebt geschreven comprimeren en decomprimeren functies voor sommige datacompressie-programma, een voor de hand liggende woning aan test is dat het comprimeren en decomprimeren van een string terug geeft de oorspronkelijke string. Hier is hoe je zou kunnen uitdrukken dat:
import unittest
import qc
klasse TestCompression (unittest.TestCase):
& Nbsp; @ qc.property
& Nbsp; def test_compress_decompress (zelf):
& Nbsp; "" ". Test of het comprimeren en decomprimeren van de rendementen van het oorspronkelijke data" ""
& Nbsp; data = qc.str () # Een willekeurige tekenreeks. Waarden worden gerandomiseerd.
& Nbsp; self.assertEqual (data, decomprimeren (comprimeren (data)), repr (data))
Dat is een gewone proef met ingebouwde unittest kader Python's (dat is de reden waarom er zoveel standaardtekst). Als alternatief zou je precies hetzelfde doen met een ander toetsingskader, zoals de minimaal breedsprakige, heel aangenaam neus. De @ qc.property decorateur loopt de gedecoreerde meerdere malen, en telkens de waarden geretourneerd door functies zoals qc.string () verschillend. Met andere woorden, QuickCheck is compatibel met vrijwel elke eenheid toetsingskader die er zijn; het is niet bijzonder veeleisend.
Functies zoals qc.str (), qc.int (), enzovoort, genereert willekeurige waarden van een bepaald type. In het bovenstaande voorbeeld, we beweren dat de eigenschap geldt voor alle snaren. Wanneer u de tests uit te voeren, zal QuickCheck gerandomiseerde strings voor het testen te genereren.
U zult merken dat ik zei: "gerandomiseerde", niet "willekeurig". Dit is opzettelijk. De verdeling van waarden wordt geknepen om interessante waarden, zoals lege strings, of snaren met NUL personages in het midden, of strings bevatten Engels tekst op te nemen. In het algemeen, QuickCheck probeert een goede mix van slimme lastig waarden en willekeur te geven. Dit is in wezen wat je zou doen, als je moest echt grondige test cases te schrijven met de hand, behalve dat je niet hoeft te doen. In de praktijk, de computer heeft minder vooroordelen over wat gezond data vormt, dus het zal vaak bugs die nooit zouden hebben plaatsgevonden aan jou om testcases te schrijven voor. Het weet niet hoe ze onbewust voorkomen dat de bugs.
U bent niet beperkt tot de ingebouwde waarde functies arbitrair. U kunt ze gebruiken als bouwstenen om uw eigen genereren. Bijvoorbeeld:
klasse Point (object):
& Nbsp; def __init __ (zelf, x, y):
& Nbsp; self.x, self.y = float (x), float (y)
def punt ():
& Nbsp; "" "Krijg een willekeurig punt." ""
& Nbsp; x = qc.int (-20, 20)
& Nbsp; y = qc.int (-34, 50)
& Nbsp; terug punt (x, y)
Vervolgens kunt u dit gebruiken om willekeurig punt waarden in eigenschappen te genereren. Hier is een neus-stijl-test:
@ Qc.property
def test_triangle_inequality ():
& Nbsp; pt = punt ()
& Nbsp; beweren abs (pt.x) + abs (pt.y)> = math.sqrt (pt.x ** 2 + pt.y ** 2), (pt.x, pt.y)
Wanneer u deze draaien, gebeurt er iets magisch: QuickCheck zal proberen om lastige waarden voor zowel de x- en y-variabelen in de klasse Point genereren, samen, dus je zult zien punten, zoals (0, 0), (1, 1), ( 0, 1), (385.904, 0), en totaal willekeurig degenen zoals (584, -35.809.648). Met andere woorden, niet alleen tekenen x en y waarden uit een stroom van willekeurige getallen met enkele lastige waarden daarin, QuickCheck daadwerkelijk proberen lastige combinaties van x en y coördinaten genereren.
Functies voor het krijgen van willekeurige data strong>
- Int (laag, hoog) geeft ints, tussen de optionele grenzen laag en hoog.
- Lang (laag, hoog) geeft longs, tussen de optionele grenzen laag en hoog.
- Float (laag, hoog) geeft praalwagens, tussen de optionele grenzen laag en hoog. Geen Infinities of NaN waarden.
& Nbsp; str (lengte = Geen, maxlen = Geen) geeft strings, van het type str. Het is UTF-8. Als lengte wordt gegeven, zal de snaren precies dat lang zijn. Als maxlen wordt gegeven, zal de string lengte ten meeste maxlen karakters.
- Unicode (lengte = Geen, maxlen = Geen) geeft unicode strings, van het type unicode. Als lengte wordt gegeven, zal de snaren precies dat lang zijn. Als maxlen wordt gegeven, zal de string lengte ten meeste maxlen karakters.
- De naam () geeft de namen, in Unicode. Deze variëren van de prozaïsche, zoals "John Smith", naar de exotische - namen met vaste spaties, of e-mailadressen, of Unicode-tekens buiten de Basic Multilingual Plane. Dit is, als er iets minder perverse dan de namen zal u in een voldoende grote set van internet gegevens te zien.
- NameUtf8 () is hetzelfde als de naam () coderen ('utf8')..
- FromList (items) terug willekeurige items uit een lijst. Dit is vooral handig voor het maken van uw eigen willekeurige gegevens generator functioneert.
- Randstr (lengte = Geen, maxlen = sys.maxint) geeft snaren van willekeurige bytes. Als lengte wordt gegeven, zal de snaren precies dat lang zijn. Als maxlen wordt gegeven, zal de string lengte ten meeste maxlen bytes.
De door str en unicode strings zijn gerandomiseerd, maar wat moeite gestoken in het maken van hen voldoende pervers om bugs te onthullen in een heleboel van de string verwerking code gezet. De namenlijst is losjes gebaseerd op gruwelijke herinneringen aan het zien van de naam verwerking code crash op real-world data, over en over en weer, omdat het steeds meer duidelijk dat de wereld is gek geworden, en we zijn echt gedoemd. (Dit gevoel gaat als je eenmaal genoeg testdekking en dingen eindelijk stoppen crashen te krijgen. Er is hoop!)
De naam en string voorbeeldgegevens in qc.arbitrary kan interessant als bron van meer deteministic testgeval gegevens. Voel je vrij om een lenen van. Het binnenwerk is magie, maar van de magische interne onderdelen, de meest interessante zijn in qc.arbitrary en qc
Eisen .
- Python
Reacties niet gevonden