Beide.
Deterministische und nicht deterministische Tests haben unterschiedliche Anwendungsfälle und unterschiedliche Werte für Ihre Suite. Im Allgemeinen kann nicht deterministisch nicht die gleiche Präzision wie deterministisches Testen liefern, das langsam zu "nicht deterministischem Testen liefert keinen Wert" herangewachsen ist. Das ist falsch. Sie können weniger genau sein, aber sie können auch viel breiter sein, was seine eigenen Vorteile hat.
Nehmen wir ein Beispiel: Sie schreiben eine Funktion, die eine Liste von ganzen Zahlen sortiert. Was wären einige der deterministischen Komponententests, die Sie nützlich finden würden?
- Eine leere Liste
- Eine Liste mit nur einem Element
- Eine Liste mit allen gleichen Elementen
- Eine Liste mit mehreren eindeutigen Elementen
- Eine Liste mit mehreren Elementen, von denen einige Duplikate sind
- Eine Liste mit
NaN
, INT_MIN
undINT_MAX
- Eine Liste, die bereits teilweise sortiert ist
- Eine Liste mit 10.000.000 Elementen
Und das ist nur eine Sortierfunktion! Sicher, Sie könnten argumentieren, dass einige davon unnötig sind oder dass einige davon mit informeller Begründung ausgeschlossen werden können. Aber wir sind Ingenieure und wir haben informelle Argumente in die Luft jagen sehen. Wir wissen, dass wir nicht schlau genug sind, um die Systeme, die wir gebaut haben, vollständig zu verstehen oder die Komplexität in unseren Köpfen zu behalten. Deshalb schreiben wir in erster Linie Tests. Das Hinzufügen nicht deterministischer Tests besagt lediglich, dass wir möglicherweise nicht klug genug sind, um alle guten Tests a priori zu kennen. Indem Sie semi-zufällige Daten in Ihre Funktion einfließen lassen, ist die Wahrscheinlichkeit sehr viel höher, dass Sie einen Randfall finden, den Sie verpasst haben.
Das schließt natürlich auch deterministische Tests nicht aus. Nicht deterministische Tests helfen dabei, Fehler in großen Programmbereichen zu finden. Sobald Sie die Fehler gefunden haben, müssen Sie nachvollziehbar nachweisen, dass Sie sie behoben haben. So:
- Verwenden Sie nicht deterministische Tests, um Fehler in Ihrem Code zu finden.
- Verwenden Sie deterministische Tests, um Korrekturen in Ihrem Code zu überprüfen.
Beachten Sie, dass dies bedeutet, dass viele fundierte Ratschläge zu Komponententests nicht unbedingt für nicht deterministische Tests gelten. Zum Beispiel, dass sie schnell sein müssen. Low-Level-Eigenschaftstests sollten schnell sein, aber ein nicht deterministischer Test wie "simulieren Sie, dass ein Benutzer zufällig auf Schaltflächen auf Ihrer Website klickt, und stellen Sie sicher, dass Sie niemals einen 500-Fehler erhalten" sollte die Vollständigkeit der Geschwindigkeit vorziehen. Lassen Sie einfach einen solchen Test unabhängig von Ihrem Erstellungsprozess ausführen, damit die Entwicklung nicht verlangsamt wird. Führen Sie es beispielsweise auf einer eigenen privaten Staging-Box aus.