Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 6

lĐặc tả bài toán: Xét hàm xét khuyến mãi khi mua vé xem phim với đầu vào

là số lượng
vé (là số nguyên, miền hợp lệ thuộc 1 đến 150) và giá vé (là số thực, hai chữ số lẻ sau
phần thập phân, miền hợp lệ thuộc 1.00 đến 10.00 ($)). Đầu ra thuộc một trong các giá trị
sau: Invalid, No discount, Discount 5%, Discount 10%.
Mối quan hệ giữa đầu vào và đầu ra như sau:
+ Invalid khi số lượng (quantity) không thuộc miền hợp lệ hoặc giá vé (price) không
thuộc miền hợp lệ
+ No discount khi 1 <= quantity < 100 và 1.00 <= price < 8.00
+ Discount 5% khi 100 <= quantity <= 150 và 1.00 <= price < 8.00
+ Discount 10% trong trường hợp còn lại (nếu 8.00 <= price <= 10.00 thì với tất cả
quantity đều Discount 10%)
Mã nguồn:
import java.util.Scanner;

public class CinemaTicket {


public static String INVALID = "Invalid";
public static String NO_DISCOUNT = "No discount";
public static String DISCOUNT_1 = "Discount 5%";
public static String DISCOUNT_2 = "Discount 10%";
public static int MIN_QUANTITY = 1;
public static int MAX_QUANTITY = 150;
public static int START_DISCOUNT_QUANTITY = 100;
public static double MIN_PRICE = 1.00;
public static double MAX_PRICE = 10.00;
public static double START_DISCOUNT_PRICE = 8.00;

public static String getDiscount (int quantity, double price) {


if ((quantity < MIN_QUANTITY || quantity > MAX_QUANTITY) ||
(price < MIN_PRICE) || price > MAX_PRICE) {
return INVALID;
} else if (quantity < START_DISCOUNT_QUANTITY || price <
START_DISCOUNT_PRICE) {
/**
* Error: (quantity < START_DISCOUNT_QUANTITY || price <
START_DISCOUNT_PRICE)
* Correct: (quantity < START_DISCOUNT_QUANTITY && price <
START_DISCOUNT_PRICE)
*/
return NO_DISCOUNT;
} else if (quantity >= START_DISCOUNT_QUANTITY && price <
START_DISCOUNT_PRICE) {
return DISCOUNT_1;
} else {
return DISCOUNT_2;
}
}

public static void main(String[] args) {


Scanner sc = new Scanner(System.in);
System.out.print("Enter quantity: ");
int quantity = sc.nextInt();
System.out.print("Enter price: ");
double price = sc.nextDouble();
System.out.println(getDiscount(quantity, price));
}
}
Xây dựng bộ test:
1. Phân tích giá trị biên:
Biên đơn giản
+ Biên của quantity gồm: 1, 100, 150 và norm_quantity là 75
+ Biên của price gồm: 1.00, 8.00, 10.00 và norm_price là 5.00
Với trường hợp đơn giản nhất có 3+3+1=7 test cases:
(quantity, price) = {(75, 1.00), (75, 8.00), (75, 10.00), (1, 5.00), (100, 5.00), (150, 5.00),
(75, 5.00)}
TT Quantity Price Expected Output
1 75 1.00 No discount
2 75 8.00 Discount 10%
3 75 10.00 Discount 10%
4 1 5.00 No discount
5 100 5.00 Discount 5%
6 150 5.00 Discount 5%
7 75 5.00 No discount

2. Phân hoạch tương đương:


Phân hoạch theo đầu ra
Chia miền đầu vào thành bốn tập ứng với 4 đầu ra như đặc tả
- Tập Invalid:
quantity < 1 || quantity > 150 hoặc price < 1.00 || price > 10.00
- Tập No discount: 1 <= quantity < 100 và 1.00 <= price < 8.00
- Tập Discount 5%: 100 <= quantity <= 150 và 1.00 <= price < 8.00
- Tập Discount 10%: còn lại
Có 4 test cases: (quantity, price) = {(-5, 5.00), (60, 4.00), (120, 4.00), (120, 9.00)}
TT Quantity Price Expected Output
1 -24 6.02 Invalid
2 56 4.64 No discount
3 127 5.38 Discount 5%
4 86 9.62 Discount 10%

3. CFT


8 điểm
quyết định => có 9 paths để đảm bảo độ đo C3

Input
ID Test Path EO Note
quantity price
tc_1 1c1(T), 2 -10 6.20 Invalid
tc_2 1c1(F), 1c2(T), 2 500 4.65 Invalid
tc_3 1c1(F), 1c2(F), 1c3(T), 2 120 -2.00 Invalid
1c1(F), 1c2(F), 1c3(F), 1c4(T),
tc_4
2 100 50.00 Invalid
1c1(F), 1c2(F), 1c3(F), 1c4(F),
tc_5 50 7.50 No discount
3c1(T), 4
1c1(F), 1c2(F), 1c3(F), 1c4(F), Discount
tc_6 125 6.00
3c1(F), 3c2(T), 4 5%
Không có testcase
1c1(F), 1c2(F), 1c3(F), 1c4(F), thỏa mãn testpath
tc_7
3c1(F), 3c2(F), 5c1(F), 7 vì 3c1 FALSE ->
5C1 TRUE
1c1(F), 1c2(F), 1c3(F), 1c4(F),
Discount
tc_8 3c1(F), 3c2(F), 5c1(T), 5c2(F), 120 9.00
10%
7

1c1(F), 1c2(F), 1c3(F), 1c4(F), Không có testcase


tc_9 3c1(F), 3c2(F), 5c1(T), 5c2(T), thỏa mãn testpath
6 vì 3c2 FALSE ->
5c2 FALSE

Báo cáo kiểm thử


1. Kiểm thử giá trị biên
Input
ID quantity price EO RO
tc_1 75 1.00 No discount No discount
tc_2 75 8.00 Discount 10% No discount
tc_3 75 10.00 Discount 10% No discount
tc_4 1 5.00 No discount No discount
tc_5 100 5.00 Discount 5% No discount
tc_6 150 5.00 Discount 5% No discount
tc_7 75 5.00 No discount No discount

2. Kiểm thử phân hoạch tương đương


Input
quantit
ID y price EO RO
tc_1 -24 6.02 Invalid Invalid
tc_2 56 4.69 No discount No discount
tc_3 127 5.38 Discount 5% No discount
tc_4 86 9.62 Discount 10% No discount

3. CFT
Input
ID Test Path quantit EO RO Note
price
y
tc_1 1c1(T), 2 -10 6.20 Invalid Invalid
tc_2 1c1(F), 1c2(T), 2 500 4.65 Invalid Invalid
tc_3 1c1(F), 1c2(F), 1c3(T), 2 120 -2.00 Invalid Invalid
1c1(F), 1c2(F), 1c3(F), 1c4(T),
tc_4
2 100 50.00 Invalid Invalid
1c1(F), 1c2(F), 1c3(F), 1c4(F),
tc_5 50 7.50 No discount No discount
3c1(T), 4
1c1(F), 1c2(F), 1c3(F), 1c4(F), Discount
tc_6 125 6.00 No discount
3c1(F), 3c2(T), 4 5%
Không có testcase
1c1(F), 1c2(F), 1c3(F), 1c4(F), thỏa mãn testpath
tc_7
3c1(F), 3c2(F), 5c1(F), 7 vì 3c1 FALSE ->
5C1 TRUE
1c1(F), 1c2(F), 1c3(F), 1c4(F),
Discount Discount
tc_8 3c1(F), 3c2(F), 5c1(T), 5c2(F), 120 9.00
10% 10%
7

1c1(F), 1c2(F), 1c3(F), 1c4(F), Không có testcase


tc_9 3c1(F), 3c2(F), 5c1(T), 5c2(T), thỏa mãn testpath
6 vì 3c2 FALSE ->
5c2 FALSE

You might also like