Sie sollten alle Ihre Unit-Tests in einem Rutsch programmieren (meiner Meinung nach). Der Gedanke, nur Tests zu erstellen, die genau das abdecken, was getestet werden muss, ist zwar richtig, aber Ihre spezielle Spezifikation erfordert eine funktionierende sine()
Funktion, no a sine()
Funktion, die für 0 und PI funktioniert.
Suchen Sie sich eine Quelle, der Sie vertrauen (ein befreundeter Mathematiker, Tabellen am Ende eines Mathematikbuchs oder ein anderes Programm, in dem die Sinusfunktion bereits implementiert ist).
Ich habe mich für bash/bc
weil ich zu faul bin, alles per Hand einzutippen :-). Wenn es waren a sine()
Funktion, würde ich einfach das folgende Programm ausführen und es in den Testcode einfügen. Ich würde auch eine Kopie dieses Skripts als Kommentar einfügen, damit ich es wiederverwenden kann, wenn sich etwas ändert (z. B. die gewünschte Auflösung, wenn sie in diesem Fall mehr als 20 Grad beträgt, oder der Wert von PI, den Sie verwenden möchten).
#!/bin/bash
d=0
while [[ ${d} -le 400 ]] ; do
r=$(echo "3.141592653589 * ${d} / 180" | bc -l)
s=$(echo "s(${r})" | bc -l)
echo "assertNear(${s},sine(${r})); // ${d} deg."
d=$(expr ${d} + 20)
done
Diese Ausgaben:
assertNear(0,sine(0)); // 0 deg.
assertNear(.34202014332558591077,sine(.34906585039877777777)); // 20 deg.
assertNear(.64278760968640429167,sine(.69813170079755555555)); // 40 deg.
assertNear(.86602540378430644035,sine(1.04719755119633333333)); // 60 deg.
assertNear(.98480775301214683962,sine(1.39626340159511111111)); // 80 deg.
assertNear(.98480775301228458404,sine(1.74532925199388888888)); // 100 deg.
assertNear(.86602540378470305958,sine(2.09439510239266666666)); // 120 deg.
assertNear(.64278760968701194759,sine(2.44346095279144444444)); // 140 deg.
assertNear(.34202014332633131111,sine(2.79252680319022222222)); // 160 deg.
assertNear(.00000000000079323846,sine(3.14159265358900000000)); // 180 deg.
assertNear(-.34202014332484051044,sine(3.49065850398777777777)); // 200 deg.
assertNear(-.64278760968579663575,sine(3.83972435438655555555)); // 220 deg.
assertNear(-.86602540378390982112,sine(4.18879020478533333333)); // 240 deg.
assertNear(-.98480775301200909521,sine(4.53785605518411111111)); // 260 deg.
assertNear(-.98480775301242232845,sine(4.88692190558288888888)); // 280 deg.
assertNear(-.86602540378509967881,sine(5.23598775598166666666)); // 300 deg.
assertNear(-.64278760968761960351,sine(5.58505360638044444444)); // 320 deg.
assertNear(-.34202014332707671144,sine(5.93411945677922222222)); // 340 deg.
assertNear(-.00000000000158647692,sine(6.28318530717800000000)); // 360 deg.
assertNear(.34202014332409511011,sine(6.63225115757677777777)); // 380 deg.
assertNear(.64278760968518897983,sine(6.98131700797555555555)); // 400 deg.
Natürlich müssen Sie diese Antwort auf das abbilden, was Ihre eigentliche Funktion tun soll. Ich will damit sagen, dass der Test das Verhalten des Codes in dieser Iteration vollständig validieren sollte. Wenn diese Iteration eine sine()
Funktion, die nur für 0 und PI funktioniert, dann ist das in Ordnung. Aber das wäre meiner Meinung nach eine große Verschwendung einer Iteration.
Es kann sein, dass Ihre Funktion so komplex ist, dass sie debe über mehrere Iterationen durchgeführt werden. Dann ist Ihr Ansatz zwei richtig und die Tests sollten in der nächste Iteration, in der Sie die zusätzliche Funktionalität hinzufügen. Andernfalls sollten Sie einen Weg finden, alle Tests für diese Iteration schnell hinzuzufügen. Dann müssen Sie sich keine Gedanken über den häufigen Wechsel zwischen echtem Code und Testcode machen.
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.