qc est un outil de test qui vous permet d'écrire des propriétés qui vous vous attendez à être vrai, et laisser l'ordinateur de générer des cas de test randomisés pour vérifier que ces propriétés détiennent effectivement & nbsp;. Par exemple, si vous avez écrit compresser et décompresser des fonctions un programme de compression de données, une propriété évident pour test est que compresser et décompresser une chaîne redonne la chaîne d'origine. Voici comment vous pourriez exprimer que:
unittest d'importation
qc d'importation
TestCompression de classe (unittest.TestCase):
& Nbsp; @ qc.property
& Nbsp; def test_compress_decompress (auto):
& Nbsp; "" ". Test que compresser et décompresser des rendements les données originales" ""
& Nbsp; data = qc.str () # Une chaîne arbitraire. Les valeurs sont randomisés.
& Nbsp; self.assertEqual (données, décompresser (compresser (données)), repr (données))
Ce est un test ordinaire avec unittest intégré de Python (ce est pourquoi il ya tellement passe-partout). Alternativement, vous pouvez faire exactement la même chose avec un framework de test différents, comme le peu bavard nez, très agréable. Le décorateur @ de qc.property exécute la fonction décorée à plusieurs reprises, et à chaque fois les valeurs renvoyées par les fonctions comme qc.string () sont différents. En d'autres termes, QuickCheck est compatible avec presque tous les framework de test unitaire là-bas; il ne est pas particulièrement exigeant.
Fonctions comme qc.str (), qc.int (), et ainsi de suite, génèrent des valeurs arbitraires d'un certain type. Dans l'exemple ci-dessus, nous affirmant que la propriété est vrai pour toutes les chaînes. Lorsque vous exécutez les tests, QuickCheck va générer des chaînes randomisés pour les tests.
Vous remarquerez que je ai dit "randomisée", pas "aléatoire". Ce est intentionnel. La distribution des valeurs est modifié pour inclure des valeurs intéressantes, comme des cordes ou des chaînes vides, avec des caractères NUL dans le milieu, ou des chaînes contenant du texte anglais. En général, QuickCheck essaie de donner un bon mélange des valeurs difficiles intelligents et aléatoire. Ce est essentiellement ce que vous feriez, si vous aviez à écrire des scénarios de test vraiment approfondies à la main, sauf que vous ne avez pas à le faire. Dans la pratique, l'ordinateur a moins de préjugés sur ce qui constitue les données saines, il sera souvent des bugs qui ne auraient jamais eu lieu de vous écrire des scénarios de test pour. Il ne sait pas comment éviter inconsciemment les bugs.
Vous n'êtes pas limité aux fonctions de valeur arbitraires intégrés. Vous pouvez les utiliser comme des blocs de construction pour générer votre propre. Par exemple:
la classe Point (objet):
& Nbsp; def __init __ (self, x, y):
& Nbsp; self.x, self.y = flotteur (x), flotteur (y)
point de def ():
& Nbsp; "" "Obtenir un point arbitraire." ""
& Nbsp; x = qc.int (-20, 20)
& Nbsp; y = qc.int (-34, 50)
& Nbsp; retourner Point (x, y)
Vous pouvez alors l'utiliser pour générer des valeurs de point arbitraire dans les propriétés. Voici un test nez-style:
@ Qc.property
def test_triangle_inequality ():
& Nbsp; pt = Point ()
& Nbsp; valoir abs (pt.x) + abs (pt.y)> = math.sqrt (pt.x ** 2 + pt.y ** 2), (pt.x, pt.y)
Lorsque vous exécutez ce, quelque chose de magique se produit: QuickCheck va essayer de générer des valeurs difficiles à la fois pour x et y des variables dans la classe Point, ensemble, de sorte que vous verrez points comme (0, 0), (1, 1), ( 0, 1), (385 904, 0), ainsi que ceux totalement aléatoire comme (584, -35.809.648). En d'autres termes, plutôt que de simplement le dessin valeurs x et y d'un flux de nombres aléatoires avec certaines valeurs délicates en elle, QuickCheck sera effectivement essayer de générer des combinaisons difficiles de coordonnées x et y.
Fonctions pour obtenir des données arbitraires
- Int (bas, haut) donne ints, entre les limites facultatives basses et hautes.
- À long (bas, haut) donne longs, entre les limites facultatives basses et hautes.
- Flotteur (bas, haut) donne flotteurs, entre les limites facultatives basses et hautes. Aucun infinis ou NaN valeurs.
& Nbsp; str (longueur = Aucun, maxlen = None) donne des chaînes, de type str. L'encodage est UTF-8. Si length est fourni, les chaînes seront exactement aussi longtemps. Si maxlen est donné, la longueur de la chaîne sera caractères au plus maxlen.
- Unicode (longueur = Aucun, maxlen = None) donne chaînes unicode, de type unicode. Si length est fourni, les chaînes seront exactement aussi longtemps. Si maxlen est donné, la longueur de la chaîne sera caractères au plus maxlen.
- Nom () donne des noms, en Unicode. Celles-ci vont de la prosaïque, comme "John Smith", les exotiques - noms contenant des espaces insécables, ou adresses e-mail, ou des caractères Unicode hors du plan multilingue de base. Ce est, si quelque chose, moins pervers que les noms que vous verrez dans un assez grand ensemble de données Internet.
- NameUtf8 () est le même que le nom () encoder ('utf8')..
- FromList (éléments) renvoie les éléments aléatoires dans une liste. Ce est surtout utile pour créer vos propres fonctions arbitraires du générateur de données.
- Randstr (longueur = Aucun, maxlen = sys.maxint) donne des chaînes d'octets aléatoires. Si length est fourni, les chaînes seront exactement aussi longtemps. Si maxlen est donné, la longueur de la chaîne sera au plus maxlen octets.
Les chaînes produites par str et unicode sont randomisés, mais certains efforts ont été mis en les rendant suffisamment perverse à révéler des bogues dans un tas de code de traitement de chaîne. La liste des noms est vaguement basé sur des souvenirs horribles de voir accident de nom de code de traitement des données du monde réel, encore et encore et encore, comme il est devenu de plus en plus clair que le monde est fou, et nous sommes vraiment condamné. (Ce sentiment passe une fois que vous obtenez une couverture et les choses enfin cesser de se écraser essai assez. Il ya de l'espoir!)
Les données de noms et des exemples de chaîne dans qc.arbitrary peuvent être intéressant comme source de plus de données sur les cas de test deteministic. Ne hésitez pas à emprunter de tout ça. Les internes sont magiques, mais des pièces internes magiques, les plus intéressants sont en qc.arbitrary et qc
Exigences :.
- Python
Commentaires non trouvées