Czy powielanie danych między testami a prawdziwym kodem jest dobre czy złe? Załóżmy na przykład, że mam klasę Python, FooSaver
która zapisuje pliki o określonych nazwach w danym katalogu:
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")
Teraz w moim teście chciałbym upewnić się, że wszystkie te pliki zostały utworzone, więc chcę powiedzieć coś takiego:
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"))
Mimo że powiela to nazwy plików w dwóch miejscach, myślę, że to dobrze: zmusza mnie do zapisania dokładnie tego, czego oczekuję od drugiego końca, dodaje warstwę ochrony przed literówkami i ogólnie daje mi pewność, że wszystko działa dokładnie tak, jak się spodziewam. Wiem, że jeśli zmienię a.foo_file
się type_a.foo_file
w przyszłości, będę musiał przeprowadzić wyszukiwanie i zamianę w moich testach, ale nie sądzę, żeby to była zbyt wielka sprawa. Wolę mieć trochę fałszywych alarmów, jeśli zapomnę zaktualizować test w zamian za upewnienie się, że rozumiem kod i testy są zsynchronizowane.
Współpracownik uważa, że to powielanie jest złe, i zalecił, aby po obu stronach zreformować coś takiego:
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)
oraz w teście:
self.assertTrue(os.path.isfile("/tmp/special_name/" + FooSaver.A_FILENAME))
self.assertTrue(os.path.isfile("/tmp/special_name/" + FooSaver.B_FILENAME))
Nie podoba mi się to, ponieważ nie daje mi to pewności, że kod działa zgodnie z oczekiwaniami --- właśnie zduplikowałem out_dir + name
krok po stronie produkcyjnej i testowej. Nie odkryje błędu w moim rozumieniu tego, jak +
działa na ciągach, i nie złapie literówek.
Z drugiej strony jest to wyraźnie mniej kruche niż dwukrotne zapisywanie tych ciągów i wydaje mi się, że powielanie danych w dwóch takich plikach jest trochę niewłaściwe.
Czy jest tu wyraźny precedens? Czy można powielać stałe w testach i kodzie produkcyjnym, czy też jest zbyt kruche?