Testler ve gerçek kod arasında veri kopyalamak iyi mi kötü mü? Örneğin, FooSaver
belirli bir dizine sahip dosyaları belirli bir dizine kaydeden bir Python sınıfım olduğunu varsayalım :
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")
Şimdi benim testte tüm bu dosyaların oluşturulduğundan emin olmak istiyorum, bu yüzden böyle bir şey söylemek istiyorum:
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"))
Bu, dosya adlarını iki yerde çoğaltmasına rağmen, bence iyi: diğer ucundan çıkmayı beklediğim şeyi tam olarak yazmamı zorlar, yazım hatalarına karşı bir koruma katmanı ekler ve genellikle işlerin çalıştığından emin olmamı sağlar tam beklediğim gibi. Ben değiştirirseniz biliyoruz a.foo_file
için type_a.foo_file
gelecekte ne yapmak zorunda kalacağım bazı arama ve değiştirme benim testlerde, ama bu bir anlaşma çok büyük olduğunu sanmıyorum. Kodu ve testleri anlamamın senkronize olduğundan emin olmak için testi güncellemeyi unutursam yanlış pozitifler tercih ederim.
Bir iş arkadaşı bu çoğaltmanın kötü olduğunu düşünüyor ve her iki tarafı da böyle bir şeye yeniden yansıtmamı tavsiye ediyor:
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)
ve testte:
self.assertTrue(os.path.isfile("/tmp/special_name/" + FooSaver.A_FILENAME))
self.assertTrue(os.path.isfile("/tmp/special_name/" + FooSaver.B_FILENAME))
Kodun beklediğim şeyi yaptığından emin olmadığım için bunu sevmiyorum --- sadece out_dir + name
hem üretim tarafında hem de test tarafında adımı kopyaladım . +
Dizelerde nasıl çalıştığını anladığımda bir hatayı açığa çıkarmaz ve yazım hatalarını yakalamaz.
Öte yandan, bu dizeleri iki kez yazmaktan daha az kırılgan ve bu gibi iki dosyada veri çoğaltmak benim için biraz yanlış görünüyor.
Burada açık bir emsal var mı? Testler ve üretim kodu boyunca sabitleri çoğaltmak doğru mu yoksa çok kırılgan mı?