Nó là tốt hay xấu để sao chép dữ liệu giữa các thử nghiệm và mã thực? Ví dụ: giả sử tôi có một lớp Python FooSaver
lưu các tệp có tên cụ thể vào một thư mục nhất định:
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")
Bây giờ trong thử nghiệm của tôi, tôi muốn đảm bảo rằng tất cả các tệp này đã được tạo, vì vậy tôi muốn nói điều gì đó như thế này:
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"))
Mặc dù điều này sao chép tên tệp ở hai nơi, nhưng tôi nghĩ nó tốt: nó buộc tôi phải viết chính xác những gì tôi mong đợi ở đầu kia, nó thêm một lớp bảo vệ chống lại lỗi chính tả và nói chung khiến tôi cảm thấy tự tin rằng mọi thứ đang hoạt động chính xác như tôi mong đợi Tôi biết rằng nếu tôi thay đổi a.foo_file
để type_a.foo_file
trong tương lai tôi sẽ phải làm một số tìm kiếm và thay thế trong các thử nghiệm của tôi, nhưng tôi không nghĩ đó là quá lớn của một thỏa thuận. Tôi muốn có một số tích cực sai nếu tôi quên cập nhật thử nghiệm để đổi lấy việc đảm bảo rằng sự hiểu biết của tôi về mã và các thử nghiệm được đồng bộ hóa.
Một đồng nghiệp cho rằng sự trùng lặp này là xấu và khuyên tôi nên cấu trúc lại cả hai mặt thành một thứ như thế này:
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)
và trong bài kiểm tra:
self.assertTrue(os.path.isfile("/tmp/special_name/" + FooSaver.A_FILENAME))
self.assertTrue(os.path.isfile("/tmp/special_name/" + FooSaver.B_FILENAME))
Tôi không thích điều này bởi vì nó không khiến tôi tự tin rằng mã đang làm những gì tôi mong đợi --- Tôi vừa mới nhân đôi out_dir + name
bước ở cả phía sản xuất và phía thử nghiệm. Nó sẽ không phát hiện ra lỗi trong cách hiểu của tôi về cách +
hoạt động của chuỗi và nó sẽ không mắc lỗi chính tả.
Mặt khác, nó rõ ràng ít giòn hơn so với việc viết ra các chuỗi đó hai lần và đối với tôi, việc sao chép dữ liệu qua hai tệp như vậy có vẻ hơi sai.
Có một tiền lệ rõ ràng ở đây? Có thể sao chép các hằng số qua các thử nghiệm và mã sản xuất, hoặc nó quá dễ vỡ?