È positivo o negativo duplicare i dati tra test e codice reale? Ad esempio, supponiamo di avere una classe Python FooSaver
che salva i file con nomi particolari in una determinata directory:
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")
Ora nel mio test vorrei assicurarmi che tutti questi file siano stati creati, quindi voglio dire qualcosa del genere:
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"))
Anche se questo duplica i nomi dei file in due punti, penso che sia buono: mi costringe a scrivere esattamente ciò che mi aspetto di uscire dall'altra parte, aggiunge uno strato di protezione contro gli errori di battitura e in generale mi fa sentire sicuro che le cose stanno funzionando esattamente come mi aspetto. So che se cambio a.foo_file
per type_a.foo_file
il futuro ho intenzione di avere a che fare un po 'di ricerca e sostituzione nel mio test, ma non credo che è troppo grande di un affare. Preferirei avere alcuni falsi positivi se dimentico di aggiornare il test in cambio di assicurarmi che la mia comprensione del codice e i test siano sincronizzati.
Un collega ritiene che questa duplicazione sia negativa e mi ha consigliato di refactificare entrambe le parti in qualcosa del genere:
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)
e nel test:
self.assertTrue(os.path.isfile("/tmp/special_name/" + FooSaver.A_FILENAME))
self.assertTrue(os.path.isfile("/tmp/special_name/" + FooSaver.B_FILENAME))
Non mi piace perché non mi rende sicuro che il codice stia facendo quello che mi aspettavo --- ho appena duplicato il out_dir + name
passaggio sia dal lato della produzione che da quello del test. Non scoprirà un errore nella mia comprensione di come +
funziona sulle stringhe e non colpirà errori di battitura.
D'altra parte, è chiaramente meno fragile che scrivere quelle stringhe due volte, e mi sembra un po 'sbagliato duplicare i dati su due file come quello.
C'è un chiaro precedente qui? Va bene duplicare le costanti tra i test e il codice di produzione o è troppo fragile?