Добре чи погано дублювати дані між тестами та реальним кодом? Наприклад, припустимо, у мене клас Python, FooSaver
який зберігає файли з конкретними іменами у заданій директорії:
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")
Тепер у своєму тесті я хотів би переконатися, що всі ці файли створені, тому я хочу сказати щось подібне:
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"))
Хоча це копіює назви файлів у двох місцях, я вважаю, що це добре: це змушує мене записати саме те, що я очікую, що вийде іншим кінцем, це додає шар захисту від помилок друку, і взагалі змушує мене відчувати себе впевненим, що справи працюють саме так, як я очікую. Я знаю, що якщо я перейду a.foo_file
на type_a.foo_file
майбутнє, мені доведеться зробити пошук і заміну в своїх тестах, але я не думаю, що це занадто велика угода. Я скоріше маю помилкові позитиви, якщо я забуду оновити тест в обмін на те, щоб переконатися, що моє розуміння коду та тестів синхронізовано.
Співробітник вважає, що це дублювання є поганим, і рекомендував мені переробити обидві сторони на щось подібне:
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)
і в тесті:
self.assertTrue(os.path.isfile("/tmp/special_name/" + FooSaver.A_FILENAME))
self.assertTrue(os.path.isfile("/tmp/special_name/" + FooSaver.B_FILENAME))
Мені це не подобається, тому що це не змушує мене бути впевненим, що код робить те, що я очікував --- Я просто дублював out_dir + name
крок як на виробничій, так і на тестовій стороні. Це не виявить помилки в моєму розумінні того, як +
працює на струнах, і не спричинить помилки в помилках .
З іншого боку, це явно менш крихко, ніж виписувати ці рядки два рази, і мені здається трохи неправильним дублювати дані у двох подібних файлах.
Чи є тут чіткий прецедент? Чи добре дублювати константи через тести та виробничий код, чи це занадто крихко?