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 + "원");
    }
}

변경된 테스트 케이스 예상 동작이 출력되는지 확인한다.