蓝桥杯4期模拟单元测试解析

单元测试题目:判定覆盖法设计测试用例(蓝桥杯练习)

题目描述

请使用判定(分支)覆盖法 为被测源代码 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 月,则返回 "月份异常"

题目要求

  1. 使用判定(分支)覆盖法 设计 7 条测试用例,使被测代码的判定覆盖率达到 100%。
  2. 使用 Java 单元测试框架 JUnit 编写测试代码。
  3. 测试代码写在提供的 LiftTicketTest.java 类中。
  4. 断言 Assert 类必须使用 org.junit 包中的 Assert
  5. 不要修改所提供的文件名称和已有代码。

被测源代码

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% 判定覆盖率。

相关推荐
中智凯灵2 小时前
采纳率从3%到80%:智能单元测试生成的进化之路
单元测试
仟濹3 小时前
2026-04-09~10-复习计划+蓝桥杯注意的点
职场和发展·蓝桥杯
liu****5 小时前
第十五届蓝桥杯大赛软件赛国赛C/C++大学B组
c++·算法·蓝桥杯·acm
念越7 小时前
蓝桥杯模拟4期自动化测试代码完整版解析
软件测试·蓝桥杯·自动化
liu****9 小时前
第15届省赛蓝桥杯大赛C/C++大学B组
开发语言·数据结构·c++·算法·蓝桥杯·acm
无缘之缘9 小时前
蓝桥杯手把手教你备战(C/C++ B组)(最全面!最贴心!适合小白!)
c语言·c++·算法·蓝桥杯
嘿黑嘿呦9 小时前
17届蓝桥杯考前准备
算法·职场和发展·蓝桥杯
yoyobravery10 小时前
蓝桥杯第16届单片机
单片机·职场和发展·蓝桥杯
汽车仪器仪表相关领域10 小时前
NHXJ-02汽车悬架检验台 实操型实战手册
人工智能·功能测试·测试工具·算法·安全·单元测试·可用性测试