나는 최근에 사람에게 친숙한 방식으로 사건이 얼마나 오래된지를 나타내는 작은 코드를 작성하고있었습니다. 예를 들어 이벤트가“3 주 전”또는“한 달 전”또는“어제”에 발생했음을 나타낼 수 있습니다.
요구 사항은 비교적 명확했으며 테스트 중심 개발의 경우에는 완벽했습니다. 테스트를 하나씩 작성하고 각 테스트를 통과하는 코드를 구현했으며 모든 것이 완벽하게 작동하는 것처럼 보였습니다. 프로덕션에 버그가 나타날 때까지.
관련 코드는 다음과 같습니다.
now = datetime.datetime.utcnow()
today = now.date()
if event_date.date() == today:
return "Today"
yesterday = today - datetime.timedelta(1)
if event_date.date() == yesterday:
return "Yesterday"
delta = (now - event_date).days
if delta < 7:
return _number_to_text(delta) + " days ago"
if delta < 30:
weeks = math.floor(delta / 7)
if weeks == 1:
return "A week ago"
return _number_to_text(weeks) + " weeks ago"
if delta < 365:
... # Handle months and years in similar manner.
테스트는 오늘, 어제, 4 일 전, 2 주 전, 1 주일 전 등의 이벤트가 발생했는지 확인하고 그에 따라 코드가 작성되었습니다.
내가 놓친 것은 어제 하루 전에 이벤트가 발생할 수 있다는 것입니다. 예를 들어, 24 시간 전에 발생한 이벤트는 하루 전에 있었을 것입니다. 무언가이지만 delta
정수는 정수이므로 하나 일뿐입니다. 이 경우 응용 프로그램은“일일 전”을 표시하는데 이는 코드에서 예상치 못하고 처리되지 않은 것입니다. 다음을 추가하여 수정할 수 있습니다.
if delta == 1:
return "A day ago"
를 계산 한 직후 delta
.
버그의 유일한 부정적인 결과는이 사건이 어떻게 발생할 수 있는지 궁금해하고 30 분 동안 낭비하고 코드에서 UTC를 균일하게 사용하더라도 시간대와 관련이 있다고 생각하지만 그 존재로 인해 어려움을 겪고 있습니다. 다음을 나타냅니다.
- 간단한 소스 코드에서도 논리적 실수를 저지르는 것은 매우 쉽습니다.
- 테스트 주도 개발은 도움이되지 못했습니다.
또한 그러한 버그를 피할 수있는 방법을 알 수 없다는 것이 걱정입니다. 코드를 작성하기 전에 더 많은 것을 생각하는 것 외에도 내가 생각할 수있는 유일한 방법은 내가 결코 일어나지 않을 것이라고 생각하는 경우에 대해 많은 주장을 추가하고 (어제 전은 어제라고 생각한 것처럼) 매초마다 반복하는 것입니다. 지난 10 년 동안 어설 션 위반이 있는지 확인했습니다. 너무 복잡해 보입니다.
처음에이 버그를 만들지 않으려면 어떻게해야합니까?