Skip to content
hello tis
Go back

[26.09.09] 복잡한 상황을 테스트 하는 방법

상황

출석 리워드는 다음과 같습니다.

보너스로 자동 출석권을 제공합니다. 결석하면 자정 이후에 출석권으로 빠진 날을 채웁니다.

리워드 수령 후 7일 연속 출석하면 자동으로 연장됩니다.

문제

리워드 수령 시점에 따라 연장 결과가 달랐습니다.

수령 기한을 지켰고 출석도 채웠지만 연장되지 않았습니다.

다음 경우도 확인해야 했습니다.

테스트를 나누는 기준이 필요했습니다.

원인

완주 시점에 리워드 만료를 판단한 것이 원인이었습니다.

수령이 늦어지면 만료일도 늦어집니다. 완주일과 만료일을 따로 판단해야 했습니다.

수령일은 자정에 바뀝니다. 8월 23일 완주 후 23일 23:59:59 수령과 24일 00:00:00 수령을 비교했습니다. 1초 차이로 만료일이 하루 늦어집니다. 광고는 만료일 다음날 00:30 직전까지 숨깁니다.

23일 23:59:59와 24일 00:00:00 수령에 따른 만료일 비교

이틀 뒤 수령한 사례입니다.

입력: 완주일행위: 수령일결과: 광고 제거 날짜
8월 23일8월 23일 수령8월 23 ~ 30일
8월 23일8월 25일 수령8월 25일 ~ 9월 1일

명세에서 구획과 경계를 찾았습니다

Maurício Aniche의 『Effective Software Testing: A developer’s guide』 2장을 참고했습니다. 이전에 쓴 명세 기반 테스트 정리를 이번 문제에 적용했습니다.

Maurício Aniche의 Effective Software Testing 책 표지

표지 출처: Simon & Schuster 공식 도서 소개 · Manning 출판

명세 기반 테스트는 요구사항에서 테스트를 찾는 방법입니다.

  1. 요구사항 이해: 입력과 기대 결과를 정합니다.
  2. 구획과 경계 분석: 같은 방식으로 처리되는 입력을 묶고 대표값과 경계값을 고릅니다.
  3. 테스트 구현: 선택한 값으로 테스트를 자동화합니다.

놓친 조건을 발견하면 앞 단계로 돌아가 보완합니다.

구획은 같은 방식으로 처리되는 입력 묶음이고, 경계는 결과가 달라지는 지점입니다.

이틀 뒤 수령은 버그가 발생한 조건입니다. 경계값인지는 수령일에 따른 완주일과 만료일의 관계를 확인해야 합니다.

해결

변수와 경계를 정했습니다

변수들이 서로 영향을 줘서 풀기 어려웠습니다. 수령일이 바뀌면 만료일이 달라지고, 출석 방식에 따라 완주 기록 시각도 달라집니다.

다른 조건을 고정하고 변수 하나의 경계부터 확인했습니다. 그다음 변수를 조합했습니다. 표는 입력 → 행위 → 결과 순서입니다.

예를 들어 출석 6일·7일 × 유예 종료 직전·정각은 네 가지 조합입니다.

입력은 행위 직전 값입니다. 연장 후에는 새 도전의 출석 일수로 표시합니다. 실제로 가능한 조합을 골랐습니다.

변수경계값확인할 결과
출석 일수6일 / 7일수령 자격
리워드 수령 여부수령 전 / 수령 후출석·출석권 획득 가능 여부
수령 요청 시각수령 기한 1초 전 / 정확히 기한수령 가능 여부
리워드 만료일과 처리 날짜만료일 당일 / 다음날 / 이틀 뒤클릭·자동 연장 가능 여부
광고 제거 종료 시각다음날 00:29:59 / 00:30:00광고 표시 여부
출석 후 지난 시간과 보유 출석권 수4시간 직전 / 4시간 경과, 1장 / 2장출석권 획득 가능 여부
클릭과 자동 처리 순서클릭 먼저 / 자동 처리 먼저완주 확인 시점과 연장 결과

글에서는 00:29:59와 00:30:00처럼 초 단위로 표시했습니다. 테스트는 경계 1ms 전과 정각을 비교합니다.

표의 결과는 다음 기준으로 읽습니다.

단일 변수: 출석 일수

공통 조건

변수와 경계

자동 출석은 출석 날짜와 기록 시각을 구분합니다.

17 ~ 23일 출석과 6일·7일의 수령 자격 비교

출석 기록과 완주

고정 조건

입력: 출석 기록행위결과: 출석 일수결과: 완주 여부
없음8월 17일 조회0일 · 시작일 없음미완주
8월 17일8월 17일 조회1일 · 시작일 8월 17일미완주
5일(17 ~ 21일 연속 출석)8월 22일 클릭6일미완주
6일(17 ~ 22일 연속 출석)8월 23일 클릭7일완주 · 클릭 시각에 완료

연속 출석 여부

고정 조건

입력: 8월 22일 출석행위결과: 출석 일수결과: 도전 시작일
있음(17 ~ 22일 연속 출석)8월 23일 클릭7일8월 17일
없음(17 ~ 21일 출석 후 22일 결석)8월 23일 클릭1일8월 23일

마지막 날 자동 출석

고정 조건

입력: 보유 출석권행위결과: 출석 보완결과: 완주
0장8월 24일 자정 자동 처리23일 보완 안 됨완주 안 됨
1장8월 24일 자정 자동 처리23일 보완 · 1장 사용7일 완주 · 완료 기록 시각은 24일

단일 변수: 수령 조건

공통 조건: 첫 출석일은 8월 17일입니다.

변수와 경계

직접 완주하면 수령 기한은 8월 31일 00:00입니다.

직접·자동 완주의 수령 기한과 기한 직전·정각 비교

출석 6일과 7일

고정 조건

입력: 출석 일수행위결과
6일(22일까지 출석 완료)8월 22일 수령 요청완주 전이므로 거절
7일(23일까지 출석 완료)8월 23일 수령 요청수령 성공 · 8월 23 ~ 30일 리워드

완주 방식과 수령 기한

고정 조건

입력: 마지막 출석 방식행위결과: 수령 기한
8월 23일 직접 클릭8월 23일 조회8월 31일 00:00 · 남은 날짜 8일 표시
8월 24일 출석권으로 23일 보완8월 24일 조회8월 31일 00:00 · 남은 날짜 7일 표시

수령 기한 직전과 정각

고정 조건

23일 완주 후 7일 이내인 30일 수령7일 이후인 31일 수령을 비교합니다.

입력: 수령 기한과의 관계행위: 수령 요청 시각결과
기한 1초 전8월 30일 23:59:59수령 성공 · 8월 30일 ~ 9월 6일 리워드
기한 정각8월 31일 00:00:00기한 경과로 거절

수령 전후와 중복 요청

고정 조건

동시 요청은 두 요청 모두 사전 검사를 통과했다고 가정합니다.

입력: 수령 완료입력: 요청 수행위결과
아니요1건수령리워드 8월 23 ~ 30일 · 다음 도전은 24일부터
예 · 리워드 적용 중1건재수령기존 리워드 적용 중이므로 거절
아니요동일 시작일로 2건동시 수령저장할 때 중복 차단 · 수령 기록은 하나

수령은 완주 → 연장 자격 → 수령 기한 순서로 판단합니다. 기한을 비교하려면 완주했고 연장 대상은 아니어야 합니다.

단일 변수: 연장 조건

공통 조건

24일 결석을 채우지 못하면 출석 시작이 늦어집니다. 재처리는 연장된 만료일을 기준으로 합니다.

변수와 경계

만료일 30일, 다음날 31일, 이틀 뒤 9월 1일의 클릭·자동 연장 비교

만료일 클릭과 출석 일수

고정 조건

입력: 클릭 전 연속 출석행위결과: 출석 일수결과: 연장
5일(25 ~ 29일 연속 출석)8월 30일 클릭6일안 됨
6일(24 ~ 29일 연속 출석)8월 30일 클릭7일8월 31일 ~ 9월 6일로 즉시 연장

자동 처리 날짜

고정 조건

이틀 뒤 처리는 31일 처리가 누락된 경우입니다.

입력: 만료 후 지난 날짜행위결과
다음날8월 31일 자정 자동 처리8월 31일 ~ 9월 6일로 연장
이틀 뒤9월 1일 자정 자동 처리처리 대상에서 제외

마지막 날 결석과 출석권 수

고정 조건

자동 처리는 결석 보완 → 완주 확인 → 연장 순서입니다.

입력: 보유 출석권행위결과: 30일 출석결과: 연장
0장8월 31일 자정 자동 처리보완 안 됨안 됨 · 00:30 광고 표시
1장8월 31일 자정 자동 처리보완하여 7일 완주8월 31일 ~ 9월 6일로 연장

연장 완료 후 재처리

고정 조건

입력: 연장 완료행위결과
예 · 만료일 9월 6일8월 30일 다시 클릭추가 연장 없음
예 · 만료일 9월 6일8월 31일 자정 자동 처리 재실행추가 연장 없음

새 리워드의 종류와 시작일

이전 리워드 = 8월 23 ~ 30일로 고정합니다. 새 리워드가 시작된 뒤 연결 여부를 조회합니다.

입력: 새 리워드 종류입력: 새 리워드 날짜행위결과: 이전 리워드과 연결결과: 다음 출석 시작
연장8월 31일 ~ 9월 6일새 리워드 시작 후 조회연결 · 실제 종료 9월 7일 00:308월 31일
새 수령8월 31일 ~ 9월 7일새 리워드 시작 후 조회별도 리워드9월 1일
연장9월 1 ~ 7일 · 하루 공백새 리워드 시작 후 조회연결 안 됨9월 1일

단일 변수: 안내와 출석권 획득

변수와 경계

출석 후 4시간 직전·정각과 보유 출석권 1장·2장의 획득 결과 비교

출석 일수와 광고 제거에 따른 안내

오늘 출석 = 가능으로 고정합니다. 안내와 실제 연장은 구분합니다.

입력: 클릭 전 일수입력: 광고 제거입력: 클릭 날짜행위결과: 안내
0 ~ 5일적용 안 됨만료일 없음출석 클릭일반 출석 완료
6일적용 안 됨만료일 없음출석 클릭완주 · 수령 안내
6일적용 중만료일출석 클릭완주 · 연장 완료 안내
6일유예 중만료 다음날출석 클릭완주 · 수령 안내
7일(만료일까지 완주)유예 중만료 다음날출석 클릭일반 출석 완료

출석 후 시간 × 보유 출석권

고정 조건

입력: 출석 후 지난 시간입력: 보유 출석권행위결과
3:59:591장다시 클릭아직 획득 불가
4:00:001장다시 클릭1장 획득 · 총 2장
3:59:592장다시 클릭획득 불가
4:00:002장다시 클릭보유 상한이므로 획득 불가

출석 시각과 당일 출석권 획득

보유 출석권 = 1장, 수령 대기 = 아니요, 오늘 출석권 획득 = 안 함으로 고정합니다.

입력: 오늘 출석 시각행위결과
19:59:5923:59:59 조회4시간 경과 · 획득 가능
20:00:0023:59:59 조회획득 시각이 다음날이므로 오늘은 종료

행동 차단과 중복 기록

입력: 행동 가능 여부입력: 오늘 동일 행동 기록행위결과
수령 대기로 차단없음클릭처리 거절
오늘 행동 모두 완료있음클릭처리 거절
저장 단계까지 도달있음동일 행동 재요청중복 기록 거절

변수 조합: 수령 전후의 출석과 출석권 획득

공통 조건: 첫 완주에 필요한 출석 날짜는 8월 17 ~ 23일입니다.

변수와 경계

수령 대기 중에는 출석과 출석권 획득이 차단됩니다.

수령 전후의 출석권 획득

고정 조건

입력: 리워드 수령행위결과: 출석권결과: 출석 일수
안 받음8월 23일 다시 클릭획득 불가7일
23일 수령 완료8월 23일 다시 클릭1장 획득7일

수령일과 오늘 출석 기록

자동 완주는 24일에 23일 결석을 채운 경우입니다.

입력: 완주 방식입력: 수령일입력: 오늘 직접 출석행위결과
23일 직접 완주미수령24일 기록 없음8월 24일 클릭수령 대기로 차단 · 7일 유지
24일 자동 완주8월 24일24일 기록 없음8월 24일 다시 클릭출석·출석권 획득 불가
23일 직접 완주8월 24일24일 기록 없음8월 24일 다시 클릭수령 당일 추가 행동 없음
23일 직접 완주8월 24일25일 기록 없음8월 25일 클릭새 도전의 출석 1일

수령 기한 전후의 출석

고정 조건

입력: 수령 기한과의 관계행위: 출석 클릭 시각결과
기한 1초 전8월 30일 23:59:59수령 대기로 출석 거절
기한 정각8월 31일 00:00:00새 도전의 출석 1일 · 이전 7일은 제외

수령 대기 중 출석권 사용

고정 조건

입력: 보유 출석권행위결과: 결석 보완결과: 보유 출석권
1장8월 25일 자정 자동 처리24일 보완 안 함1장 유지
2장8월 24 ~ 30일 자동 처리 후 조회완주 후 결석 보완 안 함2장 유지 · 다음 도전에도 보유

수령 당일 출석권을 얻으려면 그날 직접 출석한 기록이 필요합니다.

변수 조합: 수령과 연장 후 출석 시작일

오늘은 8월 31일입니다. 각 행은 별도 사례이며, 리워드 종류와 시작일을 바꿉니다.

입력: 리워드 종류입력: 리워드 시작일입력: 31일 출석행위결과: 새 도전
새 수령8월 31일없음8월 31일 조회9월 1일부터 · 오늘 추가 출석 불가
새 수령8월 30일없음8월 31일 조회오늘부터 · 출석 0일
오늘 클릭으로 연장9월 1일있음8월 31일 조회9월 1일부터 · 수령 당일 차단 규칙은 적용 안 함
오늘 자동 처리로 연장8월 31일있음8월 31일 조회오늘부터 · 출석 1일

유예 시간의 경계

유예는 만료일 다음날 00:00부터 00:30 직전까지 광고를 숨기는 30분입니다. 이때 결석 보완과 연장이 실행되므로 처리 순서도 비교합니다.

시간 경계

조합할 변수

상황변수와 경계값확인할 차이
유예 종료만료 다음날 00:29:59 / 00:30:00광고 표시·수령 가능 여부
클릭과 자동 처리클릭 먼저 / 자동 처리 먼저안내와 실제 연장의 일치 여부
자정과 완주 날짜만료일 23:59:59 / 다음날 00:00:00, 마지막 출석 날짜가 만료일 / 다음날만료 전·후 완주 여부

1. 만료일까지 완주한 사용자의 수령

고정 조건

변수와 경계

각 행은 별도 사례입니다.

입력: 유예 종료와의 관계행위결과: 광고결과: 안내·수령
1초 전8월 31일 00:29:59 조회숨김연장 대기
정각8월 31일 00:30:00 조회표시수령 대기
1초 전8월 31일 00:29:59 수령숨김연장 대상이므로 수령 거절
정각8월 31일 00:30:00 수령새 리워드로 숨김수령 성공 · 8월 31일 ~ 9월 7일 리워드

2. 클릭과 자동 처리 순서

고정 조건

변수와 경계

첫 번째는 클릭 후 자동 처리입니다. 표를 시간순으로 읽습니다.

순서: 8월 30일 완주 → 31일 00:00:03 클릭 → 00:00:05 자동 연장 → 새 도전 출석

입력: 저장된 출석입력: 실제 만료일행위결과
7일(24 ~ 30일 연속 출석)8월 30일 · 미연장8월 31일 00:00:03 클릭8건 기록 · 화면에는 상한인 7일 표시
8건(24 ~ 30일 완주 후 31일 추가 출석)8월 30일 · 미연장8월 31일 00:00:05 자동 처리9월 6일까지 연장 · 31일 출석은 새 도전의 1일차
1일(새 도전에서 31일 출석 완료)9월 6일9월 1일 클릭새 도전 출석 2일
6일(새 도전에서 8월 31일 ~ 9월 5일 출석 완료)9월 6일9월 6일 클릭7일 완주 · 9월 7 ~ 13일로 다시 연장

연장 후 31일 클릭은 새 도전의 첫 출석이 됩니다. 기록은 유지되지만 표시 일수는 7일에서 1일로 바뀝니다.

두 번째는 자동 처리 후 클릭입니다. 출석 시작이 늦어 31일에 완주합니다. 수령 기한은 남아 있습니다.

순서: 8월 31일 자정 이후 자동 처리에서 6일 확인 → 00:10 클릭으로 완주 → 00:30 유예 종료

31일 00:10 클릭 전 6일과 클릭 후 7일 비교. 완주 후 수령 대기로 전환

입력: 출석 일수입력: 자동 처리행위결과: 실제 연장결과: 안내·광고
6일(25 ~ 30일 연속 출석)아직 실행 전8월 31일 자정 이후 자동 처리없음미완주 · 광고 숨김
6일(25 ~ 30일 연속 출석)연장 없이 완료8월 31일 00:10 클릭없음 · 7일 완주만 기록수령 안내 · 광고 숨김
7일(25 ~ 31일 연속 출석)연장 없이 완료8월 31일 00:30 조회없음수령 대기 · 광고 표시

수정 전에는 연장 없이 연장 완료로 안내했습니다. 수정 후에는 완주 즉시 수령을 안내합니다.

31일 00:30까지 6일인 사용자는 광고가 나와도 수령할 수 없습니다. 오늘 출석이 가능하면 계속 출석할 수 있습니다.

3. 광고 표시와 수령·연장 자격

만료일까지 완주했는지로 나눴습니다.

아래 네 사례는 8월 16일 수령, 23일 만료를 기준으로 합니다.

고정 조건

변수와 경계

만료일까지 완주했지만 미연장인 경우. 24일 00:30에 연장 대기에서 수령 대기로 전환

비교할 기준경계값확인할 결과
7번째 출석 날짜8월 23일 / 8월 24일만료 전·후 완주 여부
만료 여부8월 23일 23:59:59 / 8월 24일 00:00:00광고 숨김과 만료의 구분
유예 종료 여부8월 24일 00:29:59 / 00:30:00광고 표시·수령·출석 가능 여부
실제 연장 처리 여부연장 기록 없음 / 있음연장 기록

만료일까지 완주한 사용자

완주 후 미연장은 출석 보완 뒤 연장이 지연되거나 실패한 경우입니다.

하루 늦게 완주하는 사용자

24일 자동 출석은 23일 결석을 채우고, 24일 클릭은 24일 출석을 채웁니다. 기록 시각이 같아도 출석 날짜는 다릅니다.

완주 날짜 × 유예 종료

각 행은 별도 사례입니다. 연장과 새 수령은 없고, 수령 기한은 남아 있습니다.

입력: 출석 날짜행위: 8월 24일 기준 조회 시각결과: 광고결과: 대기결과: 수령
17 ~ 23일 완주00:29:59숨김연장 대기불가
17 ~ 23일 완주00:30:00표시수령 대기가능
18 ~ 24일 완주(24일 00:10 클릭)00:29:59숨김수령 대기가능
18 ~ 24일 완주(24일 00:10 클릭)00:30:00표시수령 대기가능

완주 날짜와 가능한 행동

입력: 출석 날짜행위결과
17 ~ 23일 완주 · 미연장8월 24일 00:00:03 클릭출석 가능 · 연장 후 새 도전의 1일차
18 ~ 24일 완주(24일 00:10 클릭)8월 24일 00:20 조회수령 대기 · 출석권 획득 안내 차단

4. 자동 처리 전후의 완주

고정 조건

입력: 출석입력: 출석권행위결과
24 ~ 29일 출석 · 30일 결석0장자정 자동 처리미완주 · 연장 없음
24 ~ 29일 출석 · 30일 결석1장자정 자동 처리30일 보완 · 9월 6일까지 연장
24 ~ 30일 완주0장자정 자동 처리9월 6일까지 연장
25 ~ 30일 출석 후 31일 클릭으로 완주0장클릭 뒤 자동 처리만료 후 완주이므로 연장 없음

완주 기록이 있어도 7번째 출석 날짜가 만료일 뒤라면 연장하지 않습니다. 자동 처리를 반복해도 출석권 사용과 연장은 중복되지 않습니다.

수정한 규칙

결과

변수별로 경계를 비교하고 조합해 두 오류를 수정했습니다.


Share this post:

Previous Post
[26.09.10] 공공데이터로 만든 ‘공항 지금’ PoC
Next Post
[26.09.07] 화면 노출 타입이 늘어나 생긴 고민