In meinen Unit-Tests gebe ich oft beliebige Werte in meinen Code ein, um zu sehen, was er tut. Wenn ich beispielsweise weiß, dass foo(1, 2, 3)
17 zurückgegeben werden soll, könnte ich Folgendes schreiben:
assertEqual(foo(1, 2, 3), 17)
Diese Zahlen sind rein willkürlich und haben keine weiter gefasste Bedeutung (es handelt sich beispielsweise nicht um Randbedingungen, obwohl ich diese auch teste). Ich würde mich bemühen, gute Namen für diese Nummern zu finden, und so etwas zu schreiben const int TWO = 2;
ist offensichtlich nicht hilfreich. Ist es in Ordnung, die Tests so zu schreiben, oder sollte ich die Zahlen in Konstanten zerlegen?
In sind alle magischen Zahlen die gleiche erstellt? Wir haben gelernt, dass magische Zahlen in Ordnung sind, wenn die Bedeutung aus dem Kontext ersichtlich ist, aber in diesem Fall haben die Zahlen tatsächlich überhaupt keine Bedeutung.
const int TWO = 2;
ist noch schlimmer als nur mit 2
. Es entspricht dem Wortlaut der Regel mit der Absicht, ihren Geist zu verletzen.
foo
, würde es nichts bedeuten, und so die Parameter. Aber in Wirklichkeit bin ich mir ziemlich sicher, dass die Funktion diesen Namen nicht hat und die Parameter keine Namen bar1
haben bar2
, und bar3
. Machen Sie ein realistischeres Beispiel , in dem die Namen haben eine Bedeutung, dann macht es viel mehr Sinn zu diskutieren , wenn die Testdatenwerte einen Namen brauchen, auch.
1, 2, 3
es sich beispielsweise um 3D-Array-Indizes handelt, in denen Sie den Wert zuvor gespeichert haben17
, ist dieser Test meiner Meinung nach fehlerhaft ( vorausgesetzt , Sie haben auch einige negative Tests). Wenn es sich jedoch um das Ergebnis einer Berechnung handelt, sollten Sie sicherstellen, dass jeder, der diesen Test liest, versteht, warum diesfoo(1, 2, 3)
so ist17
, und magische Zahlen erreichen dieses Ziel wahrscheinlich nicht.