테스트와 실제 코드간에 데이터를 복제하는 것이 좋거나 나쁘습니까? 예를 들어 FooSaver
특정 이름의 파일을 주어진 디렉토리에 저장 하는 Python 클래스가 있다고 가정 합니다.
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
생산 측과 테스트 측 모두에서 단계를 복제했습니다 . +
문자열에서 작동 하는 방식에 대한 이해에서 오류를 발견 하지 못하며 오타를 잡지 않습니다.
반면에 문자열을 두 번 쓰는 것보다 덜 부서지기 쉽고 두 파일에서 데이터를 복제하는 것은 약간 잘못된 것 같습니다.
여기에 분명한 선례가 있습니까? 테스트와 프로덕션 코드에서 상수를 복제해도 괜찮습니까?