Хорошо или плохо дублировать данные между тестами и реальным кодом? Например, предположим, у меня есть класс 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
шаг как на стороне производства, так и на стороне тестирования. Это не обнаружит ошибку в моем понимании того, как +
работает со строками, и не поймает опечаток.
С другой стороны, это явно менее хрупко, чем записывать эти строки дважды, и мне кажется немного неправильным дублировать данные в двух таких файлах.
Здесь есть явный прецедент? Можно ли дублировать константы между тестами и рабочим кодом или они слишком хрупкие?