单元测试题目:判定覆盖法设计测试用例(蓝桥杯练习)
题目描述
请使用判定(分支)覆盖法 为被测源代码 LiftTicket 类中的 fareCalculation() 方法设计单元测试用例,并在 LiftTicketTest 类中完成单元测试代码。
基本路径法(又称独立路径测试)是在程序控制流图的基础上,通过分析控制结构的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。本题要求使用判定覆盖法。
源代码功能
景区为吸引游客,推出缆车乘车费用优惠政策,规则如下:
- 乘坐缆车原价为 100 元。
- 系统首先检查用户的消费金额是否大于 0(本题未涉及消费金额检查,实际代码中无此逻辑,以给定代码为准)。
- 旺季 (1、2、6、7、8、12月):原价打 8 折
- 学生:再打 7 折 → 最终 56 元
- 教师:再打 8 折 → 最终 64 元
- 其他:无额外折扣 → 最终 80 元
- 淡季 (3、4、5、9、10、11月):原价打 6 折
- 学生:再打 7 折 → 最终 42 元
- 教师:再打 8 折 → 最终 48 元
- 其他:无额外折扣 → 最终 60 元
- 若月份不是 1~12 月,则返回 "月份异常"。
题目要求
- 使用判定(分支)覆盖法 设计 7 条测试用例,使被测代码的判定覆盖率达到 100%。
- 使用 Java 单元测试框架 JUnit 编写测试代码。
- 测试代码写在提供的
LiftTicketTest.java类中。 - 断言
Assert类必须使用org.junit包中的Assert。 - 不要修改所提供的文件名称和已有代码。
被测源代码
java
package cn.lanqiao;
import java.text.DecimalFormat;
public class LiftTicket {
/**
* 根据月份和游客身份计算出缆车乘车费用
* @param month 月份
* @param identity 身份
* @return 最终票价
*/
public String fareCalculation(int month, String identity){
double price = 100;
if(month == 1 || month == 2 || month == 6 || month == 7 || month == 8 || month == 12){
if(identity.equals("学生")){
price = price * 0.8 * 0.7;
}else if(identity.equals("教师")){
price = price * 0.8 * 0.8;
}else{
price = price * 0.8;
}
return DecimalFormat.getIntegerInstance().format(price);
}else if(month == 3 || month == 4 || month == 5 || month == 9 || month == 10 || month == 11){
if(identity.equals("学生")){
price = price * 0.6 * 0.7;
}else if(identity.equals("教师")){
price = price * 0.6 * 0.8;
}else{
price = price * 0.6;
}
return DecimalFormat.getIntegerInstance().format(price);
}else{
return "月份异常";
}
}
}
测试类代码(LiftTicketTest.java)
java
package cn.lanqiao.unit;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.Assert; // 注意:必须使用 org.junit.Assert
import cn.lanqiao.LiftTicket;
public class LiftTicketTest {
private LiftTicket ticket;
@Before
public void setUp(){
ticket = new LiftTicket();
}
@After
public void tearDown(){
ticket = null;
}
// 旺季 - 学生
@Test
public void testFareCalculation01(){
Assert.assertEquals("56", ticket.fareCalculation(7, "学生"));
}
// 旺季 - 教师
@Test
public void testFareCalculation02(){
Assert.assertEquals("64", ticket.fareCalculation(7, "教师"));
}
// 旺季 - 其他
@Test
public void testFareCalculation03(){
Assert.assertEquals("80", ticket.fareCalculation(7, "其他"));
}
// 淡季 - 其他
@Test
public void testFareCalculation04(){
Assert.assertEquals("60", ticket.fareCalculation(3, "其他"));
}
// 淡季 - 学生
@Test
public void testFareCalculation05(){
Assert.assertEquals("42", ticket.fareCalculation(3, "学生"));
}
// 淡季 - 教师
@Test
public void testFareCalculation06(){
Assert.assertEquals("48", ticket.fareCalculation(3, "教师"));
}
// 无效月份
@Test
public void testFareCalculation07(){
Assert.assertEquals("月份异常", ticket.fareCalculation(13, "教师"));
}
}
判定覆盖分析
| 测试用例 | 月份 | 身份 | 预期结果 | 覆盖的判定 |
|---|---|---|---|---|
| 01 | 7(旺季) | 学生 | "56" | 旺季真,学生判定真 |
| 02 | 7(旺季) | 教师 | "64" | 旺季真,学生假,教师真 |
| 03 | 7(旺季) | 其他 | "80" | 旺季真,学生假,教师假 |
| 04 | 3(淡季) | 其他 | "60" | 旺季假,淡季真,内层学生假、教师假 |
| 05 | 3(淡季) | 学生 | "42" | 旺季假,淡季真,内层学生真 |
| 06 | 3(淡季) | 教师 | "48" | 旺季假,淡季真,内层学生假、教师真 |
| 07 | 13(无效) | 教师 | "月份异常" | 旺季假,淡季假(进入else分支) |
结论:7 条用例使所有判定(外层月份分支、内层身份分支)均取到真和假,判定覆盖率达到 100%。
注意事项
- 断言必须使用
org.junit.Assert,不能使用junit.framework.Assert。 - 测试类文件应放在正确的包路径下(如
test/cn/lanqiao/unit)。 - 不要修改被测类的任何代码。
总结
本题通过判定覆盖法设计了 7 个测试用例,完整覆盖了旺季/淡季/异常月份以及学生/教师/其他身份的所有分支,符合题目要求的 100% 判定覆盖率。