Ich bin für zufällige Tests und schreibe sie. Ob sie in einer bestimmten Build-Umgebung geeignet sind und in welchen Testsuiten sie enthalten sein sollten, ist jedoch eine differenziertere Frage.
Lokale Tests (z. B. über Nacht auf Ihrer Entwicklungsbox) haben ergeben, dass zufällige und offensichtliche Fehler vorliegen. Die obskuren sind arkan genug, dass ich denke, dass zufällige Tests wirklich die einzig realistische waren, um sie auszuspülen. Als Test nahm ich einen schwer zu findenden Fehler, der durch randomisierte Tests entdeckt wurde, und ließ ein halbes Dutzend Crack-Entwickler die Funktion (etwa ein Dutzend Codezeilen) überprüfen, in der sie auftrat. Keiner konnte es erkennen.
Viele Ihrer Argumente gegen randomisierte Daten sind Aromen von "Der Test ist nicht reproduzierbar". Ein gut geschriebener randomisierter Test erfasst jedoch den Samen, der zum Starten des randomisierten Samens verwendet wurde, und gibt ihn bei einem Fehler aus. Auf diese Weise können Sie den Test nicht nur manuell wiederholen, sondern auch trivial einen neuen Test erstellen, der das spezifische Problem testet, indem Sie den Startwert für diesen Test fest codieren. Natürlich ist es wahrscheinlich besser, einen expliziten Test, der diesen Fall abdeckt, von Hand zu codieren, aber Faulheit hat ihre Tugenden, und dies ermöglicht es Ihnen sogar, neue Testfälle im Wesentlichen automatisch aus einem fehlerhaften Startwert zu generieren.
Der einzige Punkt, den Sie ansprechen, über den ich jedoch nicht diskutieren kann, ist, dass er die Build-Systeme zerstört. Die meisten Build- und Continuous-Integration-Tests erwarten, dass die Tests jedes Mal dasselbe tun. Ein Test, der zufällig fehlschlägt, erzeugt Chaos, schlägt zufällig fehl und zeigt mit den Fingern auf harmlose Änderungen.
Eine Lösung besteht dann darin, Ihre randomisierten Tests weiterhin als Teil der Build- und CI-Tests auszuführen, sie jedoch mit einem festen Startwert für eine feste Anzahl von Iterationen auszuführen . Daher macht der Test immer das Gleiche, untersucht jedoch immer noch einen Teil des Eingabebereichs (wenn Sie ihn für mehrere Iterationen ausführen).
Vor Ort, z. B. wenn Sie die betreffende Klasse ändern, können Sie sie für weitere Iterationen oder mit anderen Seeds ausführen. Wenn randomisierte Tests jemals populärer werden, können Sie sich sogar eine bestimmte Reihe von Tests vorstellen, von denen bekannt ist, dass sie zufällig sind, die mit unterschiedlichen Samen durchgeführt werden können (daher mit zunehmender Abdeckung im Laufe der Zeit) und bei denen Fehler nicht dasselbe bedeuten würden als deterministische CI-Systeme (dh Läufe sind nicht 1: 1 mit Codeänderungen verbunden, sodass Sie nicht mit dem Finger auf eine bestimmte Änderung zeigen, wenn etwas fehlschlägt).
Für randomisierte Tests, insbesondere für gut geschriebene, gibt es viel zu sagen. Seien Sie also nicht zu schnell, um sie zu verwerfen!