Apakah baik atau buruk untuk menggandakan data antara tes dan kode nyata? Sebagai contoh, misalkan saya memiliki kelas Python FooSaver
yang menyimpan file dengan nama tertentu ke direktori yang diberikan:
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")
Sekarang dalam pengujian saya, saya ingin memastikan bahwa semua file ini dibuat, jadi saya ingin mengatakan sesuatu seperti ini:
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"))
Meskipun ini menduplikasi nama file di dua tempat, saya pikir itu bagus: itu memaksa saya untuk menuliskan dengan tepat apa yang saya harapkan untuk keluar dari ujung yang lain, itu menambahkan lapisan perlindungan terhadap kesalahan ketik, dan umumnya membuat saya merasa yakin bahwa segala sesuatu bekerja dengan baik persis seperti yang saya harapkan. Saya tahu bahwa jika saya beralih a.foo_file
ke type_a.foo_file
masa depan saya harus melakukan beberapa pencarian dan penggantian dalam tes saya, tapi saya pikir itu bukan masalah besar. Saya lebih suka memiliki beberapa hal positif yang salah jika saya lupa memperbarui tes sebagai imbalan untuk memastikan bahwa pemahaman saya tentang kode dan tes-tes tersebut selaras.
Seorang rekan kerja berpendapat bahwa duplikasi ini buruk, dan merekomendasikan agar saya memperbaiki kedua belah pihak dengan hal seperti ini:
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)
dan dalam ujian:
self.assertTrue(os.path.isfile("/tmp/special_name/" + FooSaver.A_FILENAME))
self.assertTrue(os.path.isfile("/tmp/special_name/" + FooSaver.B_FILENAME))
Saya tidak suka ini karena itu tidak membuat saya yakin bahwa kode melakukan apa yang saya harapkan --- Saya baru saja menggandakan out_dir + name
langkah pada sisi produksi dan sisi pengujian. Itu tidak akan mengungkap kesalahan dalam pemahaman saya tentang cara +
kerjanya pada string, dan itu tidak akan menangkap kesalahan ketik.
Di sisi lain, itu jelas kurang rapuh daripada menulis string itu dua kali, dan tampaknya sedikit salah bagi saya untuk menggandakan data di dua file seperti itu.
Apakah ada preseden yang jelas di sini? Apakah boleh menggandakan konstanta di seluruh tes dan kode produksi, atau terlalu rapuh?