Sandcorp샌드코프 · 웹·AI 제품 개발

새 프로젝트 받는 중 · 갱신 2026.11sandcorp.co.krGitHub

← 팁

테스트

우연히 같은 값인 날짜 상수 둘을 시험으로 「같다」고 묶지 않는다

방침 시행일과 기능 잠금 기준일이 같아야 한다고 시험이 묶고 있으면, 방침을 고치려 날짜를 옮길 때 다른 기능이 다시 잠깁니다. 상수마다 자기 뜻만 시험합니다.

어떤 기능을 「새 운영 방침이 시행되는 날부터」 열기로 했다고 해 보겠습니다. 처음 만들 때는 두 날짜가 같으니 방침 시행일 상수와 기능 잠금 해제일 상수를 같은 값으로 두고, 둘이 어긋나지 않게 assert POLICY_EFFECTIVE == FEATURE_UNLOCK 같은 시험까지 붙입니다. 꼼꼼해 보이는 시험입니다.

몇 주 뒤 방침을 다시 개정하게 되어 시행일 상수를 새 날짜로 옮깁니다. 시험이 깨지고, 그 시험을 통과시키려고 잠금 해제일도 같이 옮깁니다. 그러면 이미 열려 있던 기능이 새 시행일까지 다시 잠깁니다. 시험이 막아야 할 사고를 시험이 일으킨 셈입니다.

원인은 우연히 같았던 값을 같아야 하는 값으로 굳힌 데 있습니다. 「이 방침이 언제부터 효력이 있나」와 「이 기능을 언제부터 열었나」는 처음에만 같았을 뿐 뜻이 다른 사실입니다. 하나가 바뀌어도 다른 하나는 그대로여야 합니다. 시험이 두 값을 묶어 두면, 하나를 바꾸려는 사람에게 다른 하나도 바꾸라고 요구하게 됩니다.

해법은 상수마다 자기 뜻만 시험하는 것입니다. 시행일 시험은 시행일 전후에 어떤 문구가 나오는지만 보고, 잠금 시험은 기준일 전후에 기능이 잠기고 열리는지만 봅니다.

# 하지 않는다: 두 사실을 하나로 묶음
def test_unlock_matches_policy():
    assert FEATURE_UNLOCK == POLICY_EFFECTIVE

# 한다: 각자의 뜻만 지킨다
def test_feature_locked_before_unlock_date():
    assert not feature_open(on=FEATURE_UNLOCK - timedelta(days=1))
    assert feature_open(on=FEATURE_UNLOCK)

날짜·한도·버전 같은 상수를 옮기기 전에는 그 상수를 읽는 곳을 전부 찾아봅니다(grep으로 이름 검색). 다른 기능이 같은 상수를 빌려 쓰고 있다면, 옮기기 전에 그 기능에 자기 상수를 따로 주는 것이 먼저입니다.

문의 →