Question

Quickcheck et ses variantes (même il y a un dans Java ), semble être intéressant. Cependant, en dehors de l'intérêt académique, est-il vraiment utile dans un véritable test d'application (par ex. Une application de GUI ou Client / Serveur ou même prendre StackOverflow lui-même)? Toutes les expériences que vous avez eues avec des générateurs d'essais similaires sont appréciés.

Était-ce utile?

La solution

Oui, bien. En fait non, mais je l'ai étudié sous l'homme qui à l'origine développé QuickCheck et il est un gars vraiment intéressant.

En 2004, nous avons été contraints d'utiliser QuickCheck pour tester nos programmes Haskell et il était combinaison de bonnes et mauvaises. La plupart du temps mauvais parce que Haskell était un peu intimidant, mais jamais elle-même moins merveilleux quand vous l'avez travail.

John a depuis mis au point ce qu'il a écrit années et effectivement aidé à tester Ericssion leur matériel de télécommunications complexe, et il a trouvé des bugs dans 20 millions ou donc les lignes de code que la réduction à seulement trois étapes à travers son approche. Il est un grand orateur de sorte qu'il est toujours une joie en écoutant lui présenter ce qu'il fait si bien, mais dans l'ensemble, ce qu'il a fait avec QuickCheck était nouveau pour moi. Alors je lui ai demandé, ce que son intérêt était porté cette sur le marché. Il était ouvert à l'idée, mais au moment de son entreprise (basé autour QuickCheck) était relativement nouveau et donc il y avait d'autres domaines, il se concentrerait sur. Ceci est maintenant 2007. Mon point est, vous pouvez apprendre de QuickCheck même si vous finissez l'habitude en utiliser.

Mais ce qui est QuickCheck? C'est un framework de test combinatoire et un moyen intéressant de tester des programmes. Les personnes de plus de Microsoft Research a construit Pex qui est en quelque sorte similaire. Pex génère automatiquement des tests en examinant votre IL. Cependant, John écrirait un générateur d'entrée possibles et les propriétés essai d'une fonction. Une propriété est quelque chose qui peut facilement être testé et il est beaucoup plus formel. par exemple. inverser une liste? Eh bien, renversant une liste, est la même chose que la division d'une liste en deux moitiés, les inverser chacun individuellement et puis concaténer les deux moitiés inversées dans l'ordre inverse.

1,2,3,4 // original
1,2 3,4 // split into A and B
2,1 4,3 // reverse A and B
4,3,2,1 // concat B and A

Ceci est une grande propriété à tester avec QuickCheck appelé la spécification et le résultat est tout à fait étonnant.

Pex est agréable, mais pas aussi cool que QuickCheck, Pex simplifie les choses, QuickCheck fait pour, mais il faut beaucoup d'efforts pour écrire une bonne spécification.

Le pouvoir de QuickCheck est que quand elle se heurte à un échec, il réduira l'entrée qui a causé votre test à l'échec, à la plus petite forme possible. vous laissant avec une description détaillée de ce que la progression de l'état a provoqué votre échec du test. En comparaison avec d'autres cadres d'essai qui va juste essayer de briser votre code d'une manière force brute.

Ceci est rendu possible en raison de la façon dont vous écrivez vos spécifications de test. QuickCheck repose sur des pseudo-aléatoire pour inventer entrée et il est de ce fait, son capable de faire marche arrière et trouver entrée vraiment petit qui ne passe pas le test.

Il est beaucoup plus de travail pour écrire des propriétés, mais QuickCheck le résultat final est un meilleur test. Comme John dit lui-même, 70% des insectes sont capturés par les tests unitaires, mais il est l'autre 30%, ce qui provoque votre programme crash. QuickCheck teste les 30% dernière.

Autres conseils

Je l'ai fait un vrai problème Haskell qui a impliqué une simulation d'événements discrets. J'ai donc écrit une bibliothèque DES basée sur la monade de continuation, ainsi que les équivalents à MVAR et canaux. Je avais besoin de vérifier que cela a fonctionné correctement, donc je l'ai écrit un tas de propriétés QuickCheck de démontrer que, par exemple, deux flux de données simultanées écrites sur un canal serait fusionné correctement sans laisser tomber quoi que ce soit.

J'ai aussi utilisé QuickCheck pour documenter et vérifier les propriétés de mon et Ranged jeux bibliothèques.

Dans mon expérience QuickCheck est parfois grande. Si vous pouvez résumer une propriété importante d'une manière concise, bien que l'algorithme qui offre cette propriété est velu, alors QuickCheck est une grande victoire. D'autre part, je trouve souvent que l'algorithme est équivalent à la propriété que je veux vérifier. Dans ce cas, je cherche des propriétés plus simples. Par exemple, la fonction suppose « foo » est censé être non strictement monotones. Ensuite, vous pouvez écrire

prop_fooMonotonic x y = (x > y) ==> (foo x >= foo y)

J'utilise QuickCheck pour beaucoup de choses personnelles. Au cours des six derniers mois:

  • Ran QuickCheck pour tester les transformations de couleurs et cosinus discrète transforme en un compresseur d'image.

  • Ran QuickCheck pour tester un module différenciation symbolique, je fouetté pour une optimisation numérique.

  • Ran QuickCheck pour tester un arbre ternaire recherche dans le style de Bentley et Sedgewick.

QuickCheck rencontre rarement tous mes besoins tests unitaires, mais il est un excellent moyen de commencer --- et les lois QuickCheck faire une bonne documentation.

ScalaCheck (a QuickCheck pour Scala) est utilisé pour tester Java fonctionnelle , une bibliothèque qui, entre autres, met en œuvre un QuickCheck pour Java .

xmonad est testé AFAIK abondamment avec QuickCheck

Je ne l'ai utilisé Haskell dans un environnement de production pour le développement d'outils peu d'aide. Principalement parce que je suis le seul développeur, je sais que les lectures Haskell. Je QuickCheck largement bien, et suis vraiment ennuyé que quelque chose de semblable n'est pas disponible en C #. Je décide donc d'essayer de l'écrire moi-même . Je regardais Pex aussi, mais trouvé les techniques d'exploration du programme qui sont utilisés pour trouver que la façon dont QuickCheck fait cette entrée minimale moins intéressante.

J'utilise QuickCheck pour tester le comportement des programmes de ligne de commande dans toutes les langues.

Il est particulièrement utile pour trouver des entrées sur lesquelles accident de bas niveau ou des programmes typés dynamiquement.

Pour plus de commodité, j'ai écrit http://hackage.haskell.org/package/proctest , qui comprend quelques exemples de QuickCheck utilisés conjointement avec hspec et hunit pour tester les programmes de ligne de commande de cette façon.

Nous utilisons FsCheck pour vérifier que nos OCaml à F traductions # sont correctes, et que nos versions optimisées fonctionnent de la mêmes que les versions d'un-optimisé. Je prévois aussi de l'utiliser pour tester l'analyseur et depuis lexer NHol projet utilise un analyseur Combinator.

Nous avons aussi des fonctions d'assistance qui nous permettent d'exécuter le test dans NUnit (XUnit pour .Net). Voir assertProp .

Je l'ai utilisé pour tester QuickCheck SMS encodeur et décodeur PDU dans la plate-forme Linux LG Mobile. A (ancienne) version d'un logiciel, j'ai développé à ce moment est disponible pour téléchargement à l'adresse http: / /hackage.haskell.org/package/GenSmsPdu-0.1

Ce n'est pas mon projet, mais le paquet containers utilise QuickCheck assez largement. Personnellement, j'ai essayé de l'utiliser pour comparer un tamis peu stupide premier je l'ai écrit à un dans arithmoi, ce qui m'a amené à découvrir que l'un dans arithmoi segfaults parfois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top