Java 문제 결제액 할인 로직 구현 및 테스트 설계
문제
사용자의 나이와 결제액 따라 할인을 제공한다.
할인 조건은 다음과 같다.
- 나이 12세 이하 1,000원 할인
- 결제액 10,000원 이상 결제 시 1,000원 할인
- 나이와 결제는 중복 할인을 제공할 수 있다.
할인 조건 적용 후 "총 할인 금액"과 "결제액" 메시지가 나오도록 구현한다.
테스트
구현 전에 테스트 분석 및 설계를 먼저 진행하였다.
첫째로, 아래 이유로 결정문 커버리지(Decision Coverage) 사용하였다.
- 나이와 결제액 if가 두개로 분기되고, if 조건문이 하나밖에 없으므로 결정문 커버리지로 충분하다.
💡
결정문 커버리지(Decision Coverage) 용어 대신 분기 커버리지(Branch Coverage)로 부르기도 하다.
결정문 커버리지는 if 분기마다 T / F 이 모두 충족하는지 확인한다.
Cond | 1. | 2. | 3. | 4. |
---|---|---|---|---|
age <= 12 | T | T | F | F |
price >= 10000 | T | F | T | F |
- 표와 같이 경로 4개를 도출한 경우 결정 커버리지는 모두 충족된다.
둘째로, 테스트 실행에 필요한 테스트 데이터를 선별한다.
Cond | T/F | data |
---|---|---|
age | T | 12 |
age | F | 13 |
price | T | 10000 |
price | F | 9999 |
💡
테스트 데이터는 수치로 되어있어서 2-point 경계값 분석으로 도출하였다.
셋째로, 입력 조건에 따른 예상 동작이 필요함으로 결정 테이블 테스팅을 진행하였다.
조건1 | 나이 12세 이하 | Y | Y | N | N |
조건2 | 결제액 10000원 이상 | Y | N | Y | N |
행동1 | 1000원 할인 | O | O | O | |
행동2 | 중복 할인 | O |
넷째로, 테스터 데이터와 결정 테이블을 보고 테스트 케이스를 제작하였다.
index | 데이터 | 예상결과 |
---|---|---|
1. | age=12, price=10000 | 총 할인 금액 2000원, 결제액 8000원 |
2. | age=12, price=9999 | 총 할인 금액 1000원, 결제액 8999원 |
3. | age=13, price=10000 | 총 할인 금액 1000원, 결제액 9000원 |
4. | age=13, price=9999 | 총 할인 금액 0원, 결제액 9999원 |
결제액 할인 로직 구현 후 테스트가 잘 수행되는지 확인한다.
💡
실제 프로그램의 입력 부분은 최댓값, 최소값, 00, -1 등 유효성 검증을 포함하여 테스트를 수행한다.
개발 구현
public class Cond {
public static void main(String[] args) {
int age = 13;
int price = 10000;
int discount = 0;
if (price >= 10000) {
discount += 1000;
System.out.println("! 10000원 이상 구매. 1000원 할인");
}
if (age <= 12) {
discount += 1000;
System.out.println("! 12살 이하 어린이 1000원 할인");
}
price -= discount;
System.out.println("총 할인 금액: " + discount + "원");
System.out.println("결제액: " + price + "원");
}
}
Code Output:! 10000원 이상 구매. 1000원 할인
총 할인 금액: 1000원
결제액: 9000원
int age, int price
를 테스트 설계에 도출한 TC를 실행해서 예상 값이 출력되는지 확인한다.
부록. 중복 할인을 없애주세요!
기획자가 생각했던 할인액이 커서 적자가 발생되면, 중복 할인 되지 않도록 제거 요청이 올 수 있다.
- 나이 12세 이하 1,000원 할인
- 결제액 10,000원 이상 결제 시 1,000원 할인
나이와 결제는 중복 할인을 제공할 수 있다.
이렇게 되었을 경우, 테스트 설계를 변경하고 개발 로직도 변경해주어야 한다.
테스트 설계 변경
이미 테스트 설계한 것 중 결정 테이블 테스팅와 테스트케이스(TC) 표를 변경해주면 된다.
- 결정 테이블 테스팅 표
조건1 | 나이 12세 이하 | Y | Y | N | N |
조건2 | 결제액 10000원 이상 | Y | N | Y | N |
행동1 | 1000원 할인 | O | O | O |
- 테스트 케이스 표
index | 데이터 | 예상결과 |
---|---|---|
1. | age=12, price=10000 | 총 할인 금액 1000원, 결제액 9000원 |
2. | age=12, price=9999 | 총 할인 금액 1000원, 결제액 8999원 |
3. | age=13, price=10000 | 총 할인 금액 1000원, 결제액 9000원 |
4. | age=13, price=9999 | 총 할인 금액 0원, 결제액 9999원 |
개발 로직 변경
age, price 할인은 if문 2개 독립적으로 수행하도록 하였는데, 이제는 서로 베타적인 관계로 만들 필요가 있다. else if 문을 사용한다.
public class Cond {
public static void main(String[] args) {
int age = 11;
int price = 10000;
int discount = 0;
if (price >= 10000) {
discount += 1000;
System.out.println("! 10000원 이상 구매. 1000원 할인");
} else if (age <= 12) {
discount += 1000;
System.out.println("! 12살 이하 어린이 1000원 할인");
}
price -= discount;
System.out.println("총 할인 금액: " + discount + "원");
System.out.println("결제액: " + price + "원");
}
}
변경된 테스트 케이스 예상 동작이 출력되는지 확인한다.