Frage

Quickcheck und seine Varianten (auch gibt es eine in Java ), scheint interessant zu sein. Doch abgesehen von akademischem Interesse ist es wirklich nützlich in einem realen Anwendungstest (z. B. eine GUI-Anwendung oder Client / Server oder sogar nimmt selbst Stackoverflow)? Irgendwelche Erfahrungen, die man mit ähnlichen Prüfgeneratoren hatte geschätzt wird.

War es hilfreich?

Lösung

Ja, gut. Eigentlich nicht, aber ich habe unter den Menschen untersucht, die ursprünglich Quick Check entwickelt und er ist ein wirklich interessanter Typ.

Im Jahr 2004 waren wir gezwungen, Quick Check zu nutzen, um unsere Haskell Programme zu testen und es war Kombination von gut und schlecht. Meist schlecht, weil Haskell ein bisschen entmutigend selbst war aber nie weniger wunderbar, wenn Sie es bekommen zu arbeiten.

John hat sich seitdem das perfektioniert, die er Jahre schrieb zurück und half tatsächlich Erics ihre komplexen Telekommunikations-Hardware zu testen, und er fand Fehler in 20 Millionen oder so Codezeilen, die auf nur drei Schritte durch seinen Ansatz zu reduzieren. Er ist ein großer Redner, so ist es immer eine Freude ihm zuzuhören präsentieren, was er tut so gut, aber alles in allem, was er mit Quick Check tat, war mir neu. Also fragte ich ihn, was sein Interesse auf den Markt zu bringen war. Er war offen für die Idee, aber zu der Zeit sein Geschäft (Basis Quick Check) war relativ neu und so gibt es andere Bereiche er sich darauf konzentrieren würde. Dies ist nun 2007. Mein Punkt ist, können Sie von Quick Check lernen könnten, selbst wenn Sie nicht es am Ende mit.

Aber was ist Quick Check? Es ist eine kombinatorischer Test-Framework und eine interessante Möglichkeit, Programme zu testen. Die Leute bei Microsoft Research über hat eine eingebaute Pex , welche Art von ähnlich ist. Pex erzeugt Tests automatisch von Ihrem IL untersuchen. Allerdings würde John einen Generator zur möglichen Ein- und Testeigenschaften einer Funktion schreiben. Eine Eigenschaft ist etwas, das leicht getestet werden kann, und es ist viel mehr formal. z.B. Umkehren einer Liste? Nun, eine Liste Umkehr, ist das gleiche wie eine Liste in zwei Hälften aufgeteilt, so dass sie jeweils einzeln umgekehrt und dann die beiden Hälften umgekehrt in umgekehrter Reihenfolge verketten.

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

Dies ist eine großartige Eigenschaft mit Quick Check testet die Spezifikation genannt, und das Ergebnis ist ziemlich erstaunlich.

Pex ist schön, aber nicht so cool wie Quick Check, Pex Dinge vereinfacht, tut Quick Check, aber es braucht viel Arbeit, eine gute Beschreibung zu schreiben.

Die Macht des Quick Check ist, dass, wenn es in einen Ausfall läuft wird es den Eingang zu reduzieren, die der Test verursacht zu scheitern, auf die kleinstmögliche Form. So dass Sie mit einer detaillierten Beschreibung dessen, was das Fortschreiten des Zustandes verursacht Ihren Test fehlschlagen. Im Vergleich zu anderem Test-Frameworks, die nur versuchen, Ihren Code in einer Brute-Force-Art und Weise zu brechen.

Dies wird möglich gemacht durch, wie Sie Ihre Testspezifikation schreiben. Quick Check basiert auf pseudo-Zufälligkeit Eingang zu erfinden und es ist aus diesem Grund, seine Lage, Rückzieher und wirklich kleinen Eingang finden, die nicht den Test nicht besteht.

Es ist viel mehr Arbeit Quick Check Eigenschaften zu schreiben, aber das Endergebnis ist besser Tests. Wie John selbst sagte, sind 70% der Fehler durch Unit-Tests gefangen, aber es ist, dass andere 30%, was zu einem Absturz Ihres Programms verursacht. Quick Check ist es, die letzten 30% zu testen.

Andere Tipps

Ich habe ein echtes Problem Haskell durchgeführt, die eine diskrete Ereignissimulation beteiligt. Also schrieb ich einen DES-Bibliothek basiert auf der Fortsetzung Monade, zusammen mit den Mitteln zu MVar und Kanäle. Ich brauchte zu prüfen, ob diese richtig gearbeitet, so schrieb ich, dass eine Reihe von Quick Check Eigenschaften zu zeigen, zum Beispiel zwei Ströme gleichzeitig auf einen Kanal geschriebenen Daten korrekt, ohne etwas zu fallen verschmolzen wäre.

Ich habe auch Quick Check zu dokumentieren und überprüfen Sie die Eigenschaften in meinem Ranged Sets und Dezimal Bibliotheken.

Nach meiner Erfahrung Quick Check ist manchmal groß. Wenn Sie eine wichtige Eigenschaft in prägnanter Weise zusammenfassen kann, obwohl der Algorithmus, liefert diese Eigenschaft haarigen ist, dann ist Quick Check ein großer Gewinn. Auf der anderen Seite finde ich oft, dass der Algorithmus auf die Eigenschaft entspricht ich überprüfen möchten. In diesem Fall sehe ich für einfachere Eigenschaften. Zum Beispiel werden suppose Funktion „foo“ soll nicht streng monoton sein. Dann können Sie schreiben

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

Ich benutze Quick Check für viele persönliche Sachen. Innerhalb der letzten sechs Monate:

  • Ran Quick Check Farbtransformationen und diskrete Kosinustransformationen in einem Bildkompressor zu testen.

  • Ran Quick Check einen symbolischen Differenzierungsmodul zu testen ich für einige numerische Optimierung gepeitscht.

  • Ran Quick Check einen ternärer-Suchbaum im Stil von Bentley und Sedgewick zu testen.

Quick Check trifft selten alle meine Komponententests Bedürfnisse, aber es ist eine gute Möglichkeit, um loszulegen --- und die Quick Check Gesetze machen eine gute Dokumentation.

Ich habe es ziemlich viel verwendet, meist in straighforward Weise, hauptsächlich für Testprotokoll und Parser-Implementierungen.

Hier ist jedoch weniger trivial etwas aus meiner persönlichen Erfahrung: http://www.haskell.org/ haskellwiki / QuickCheck_as_a_test_set_generator

Scalacheck (a Quick Check für Scala) wird verwendet, um eine href zu testen <= "http : //functionaljava.org "rel = "noreferrer"> Functional Java , eine Bibliothek, die, unter anderem, implementiert ein Quick Check für Java .

AFAIK XMonad wird ausgiebig getestet mit Quick Check

Ich habe nur Haskell in einer Produktionsumgebung für die Entwicklung von kleinen Helfer-Tool. Vor allem, weil ich der einzige Entwickler bin ich weiß, dass liest Haskell. Ich benutzen Quick Check ausgiebig aber, und bekam wirklich ärgerlich, dass etwas Ähnliches ist in C # nicht verfügbar. Also entschied ich mich, um zu versuchen und es selbst schreiben . Ich sah auch bei Pex, aber die Programmexplorationstechniken gefunden die verwendet werden, dass ein minimalen Eingang weniger interessant als die Art und Weise Quick Check tut zu finden.

Ich verwende Quick Check das Verhalten der Befehlszeilenprogramme in jeder Sprache geschrieben zu testen.

Es ist besonders nützlich Eingänge auf dem Low-Level zu finden oder dynamisch typisierte Programme zum Absturz bringen.

Der Einfachheit halber ich schrieb http://hackage.haskell.org/package/proctest , die einige Beispiele für Quick Check umfasst zusammen mit HSPEC und hunit zu testen Kommandozeilenprogramme auf diese Weise verwendet wird.

Wir verwenden FsCheck zu überprüfen, ob unsere OCaml zu F # Übersetzungen korrekt sind, und dass unsere optimierten Versionen arbeiten die gleich wie die un-optimierte Versionen. Ich plane, es auch den Lexer und Parser, da die NHol Projekt Parser combinator.

Wir haben auch Hilfsfunktionen haben, die es uns ermöglichen, den Test auszuführen innerhalb NUnit (XUnit für .Net). Siehe assertProp .

I Quick Check zur Prüfung von SMS-PDU-Encoder und Decoder in LG Linux Mobile-Plattform verwendet. A (alte) Version von einem Stück Software, die ich zu diesem Zeitpunkt zum Download unter http entwickelt: / /hackage.haskell.org/package/GenSmsPdu-0.1

Es ist nicht mein Projekt, aber das containers Paket verwendet Quick Check ziemlich umfangreich. Persönlich habe ich versucht, es mit einem dummen kleinen prime Sieb vergleichen ich zu einem in arithmoi schrieb, die mich dazu gebracht, dass man in arithmoi manchmal segfaults zu entdecken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top