Ist es gut oder schlecht, Daten zwischen Tests und echtem Code zu duplizieren? Angenommen, ich habe eine Python-Klasse FooSaver
, die Dateien mit bestimmten Namen in einem bestimmten Verzeichnis speichert:
class FooSaver(object):
def __init__(self, out_dir):
self.out_dir = out_dir
def _save_foo_named(self, type_, name):
to_save = None
if type_ == FOOTYPE_A:
to_save = make_footype_a()
elif type == FOOTYPE_B:
to_save = make_footype_b()
# etc, repeated
with open(self.out_dir + name, "w") as f:
f.write(str(to_save))
def save_type_a(self):
self._save_foo_named(a, "a.foo_file")
def save_type_b(self):
self._save_foo_named(b, "b.foo_file")
Jetzt möchte ich in meinem Test sicherstellen, dass alle diese Dateien erstellt wurden. Deshalb möchte ich Folgendes sagen:
foo = FooSaver("/tmp/special_name")
foo.save_type_a()
foo.save_type_b()
self.assertTrue(os.path.isfile("/tmp/special_name/a.foo_file"))
self.assertTrue(os.path.isfile("/tmp/special_name/b.foo_file"))
Obwohl dies die Dateinamen an zwei Stellen dupliziert, finde ich es gut: Es zwingt mich, genau das aufzuschreiben, was ich am anderen Ende erwarten würde, es schützt mich zusätzlich vor Tippfehlern und lässt mich im Allgemeinen zuversichtlich sein, dass die Dinge funktionieren genau wie ich es erwarte. Ich weiß , dass , wenn ich ändern , a.foo_file
um type_a.foo_file
in der Zukunft werde ich einige Suche und Ersetzen in meinen Tests zu tun haben, aber ich glaube nicht , das ist zu große Sache. Wenn ich vergesse, den Test im Gegenzug zu aktualisieren, um sicherzugehen, dass mein Verständnis des Codes und der Tests synchron sind, möchte ich lieber einige Fehlalarme erhalten.
Ein Kollege hält diese Vervielfältigung für schlecht und empfahl, dass ich beide Seiten in etwa so umgestalte:
class FooSaver(object):
A_FILENAME = "a.foo_file"
B_FILENAME = "b.foo_file"
# as before...
def save_type_a(self):
self._save_foo_named(a, self.A_FILENAME)
def save_type_b(self):
self._save_foo_named(b, self.B_FILENAME)
und im Test:
self.assertTrue(os.path.isfile("/tmp/special_name/" + FooSaver.A_FILENAME))
self.assertTrue(os.path.isfile("/tmp/special_name/" + FooSaver.B_FILENAME))
Ich mag das nicht, weil es mich nicht sicher macht, ob der Code das tut, was ich erwartet hatte. Ich habe den out_dir + name
Schritt gerade sowohl auf der Produktionsseite als auch auf der Testseite dupliziert . Es wird keinen Fehler in meinem Verständnis der Funktionsweise +
von Zeichenfolgen aufdecken und keine Tippfehler erkennen.
Andererseits ist es deutlich weniger spröde als das zweimalige Ausschreiben dieser Zeichenfolgen, und es scheint mir ein wenig falsch, Daten über zwei solche Dateien zu duplizieren.
Gibt es hier einen klaren Präzedenzfall? Ist es in Ordnung, Konstanten über Tests und Produktionscode zu duplizieren, oder ist es zu spröde?