क्या परीक्षणों और वास्तविक कोड के बीच डेटा की नकल करना अच्छा है या बुरा? उदाहरण के लिए, मान लीजिए कि मेरे पास एक पायथन वर्ग है 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
प्रोडक्शन साइड और टेस्ट साइड दोनों पर स्टेप डुप्लिकेट किया है । यह +
स्ट्रिंग्स पर काम करने की मेरी समझ में एक त्रुटि को उजागर नहीं करेगा , और यह टाइपोस को नहीं पकड़ेगा।
दूसरी ओर, यह उन तार को दो बार लिखने की तुलना में स्पष्ट रूप से कम भंगुर है, और यह मुझे उस तरह से दो फ़ाइलों में डेटा की नकल करने के लिए थोड़ा गलत लगता है।
क्या यहाँ एक स्पष्ट मिसाल है? क्या परीक्षण और उत्पादन कोड में स्थिरांक की नकल करना ठीक है, या क्या यह बहुत भंगुर है?