Zu diesem Zeitpunkt, sollte ich:
-
einen echten Code implementieren, der über die beiden einfachen Tests hinaus funktioniert?
-
mehr dummen Code implementieren, der nur für die beiden einfachen Tests funktioniert?
Weder noch. Ich bin mir nicht sicher, woher Sie den Ansatz "nur einen Test nach dem anderen schreiben" haben, aber es ist auf jeden Fall ein langsamer Weg.
Es geht darum, klare Tests zu schreiben und diese klaren Tests für den Entwurf Ihres Programms zu nutzen.
Schreiben Sie also genügend Tests, um eine Sinusfunktion tatsächlich zu validieren. Zwei Tests sind eindeutig unzureichend.
Im Falle einer kontinuierlichen Funktion müssen Sie eventuell eine Tabelle mit bekannten guten Werten bereitstellen. Warum warten?
Die Prüfung kontinuierlicher Funktionen ist jedoch mit einigen Problemen verbunden. Man kann nicht einem stummen TDD-Verfahren folgen.
Sie können nicht testen alle Fließkommawerte zwischen 0 und 2*pi. Sie können nicht ein paar zufällige Werte testen.
Im Fall von kontinuierlichen Funktionen funktioniert ein "strenges, unreflektiertes TDD" nicht. Das Problem hier ist, dass Sie wissen, dass Ihre Implementierung der Sinusfunktion auf einer Reihe von Symmetrien basieren wird. Sie müssen auf der Grundlage dieser Symmetrie-Regeln, die Sie verwenden, testen. Bugs verstecken sich in Rissen und Ecken. Rand- und Eckfälle sind Teil der Implementierung, und wenn Sie unbedacht TDD folgen, können Sie das nicht testen.
Bei kontinuierlichen Funktionen müssen Sie jedoch die Rand- und Eckfälle der Implementierung testen.
Das bedeutet nicht, dass TDD kaputt oder unzureichend ist. Es bedeutet, dass sklavische Hingabe an einen "Test zuerst" nicht funktionieren kann, ohne darüber nachzudenken, was Ihr eigentliches Ziel ist.
1 Stimmen
Wenn Sie Fließkommazahlen auf Gleichheit prüfen, verwenden Sie etwas wie assertDoubleEqual, wenn Ihre Bibliothek es bereitstellt, oder schreiben Sie Ihre eigene Methode wie assert( abs(float1-float2)<DELTA );
0 Stimmen
Ich bin mit Matlab xUnit, die assertElementsAlmostEqual Methode bietet
0 Stimmen
@Jader Dias: Bitte zeigen Sie Code, der dem entspricht, was Sie tatsächlich tun. Wenn Sie assertElementsAlmostEqual verwenden, zeigen Sie das bitte in Ihrem Code.
0 Stimmen
Das Hauptanliegen dieser Frage ist nicht die Assert-Methode, sondern die TDD-Richtlinien.
1 Stimmen
Die Verwendung von "assertDoubleEqual", "assertElementsAlmostEqual" usw. ist nur eine erste Annäherung und kann, wie oben beschrieben, zu irreführenden Ergebnissen führen. Sie benötigen die numerische Analyse, um herauszufinden, welche Fehlerdifferenz nahe genug ist, und Sie müssen mit ziemlicher Sicherheit relative Fehler und nicht absolute Fehler berücksichtigen.