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

相关推荐
wljy111 小时前
牛客每日一题(2026.4.30) 整数域二分
c语言·c++·算法·蓝桥杯·二分
小短腿的代码世界12 小时前
Qt WebEngine深度解析:Chromium多进程架构与Qt信号槽的双向融合
qt·搜索引擎·单元测试
Advancer-1 天前
第二次蓝桥杯总结(上)
java·算法·职场和发展·蓝桥杯
晓晓hh1 天前
JavaWeb学习——JUnit和日志
学习·junit·单元测试
测试员周周1 天前
【AI测试系统】第1篇:LangGraph 实战:用 State Graph 搭建 AI测试流水线(4 步编排 + RAG 增强 + 完整代码)
linux·windows·python·功能测试·microsoft·单元测试·多轮对话
WL_Aurora1 天前
备战蓝桥杯国赛【day3】
python·蓝桥杯
wljy12 天前
每日一题(2026.4.29) 猫猫与数学
c语言·c++·算法·蓝桥杯·stl·牛客
待bong2 天前
蓝桥杯EDA客观题(自己收集的)
职场和发展·蓝桥杯
沉默-_-2 天前
备战蓝桥杯-哈希
c++·学习·算法·蓝桥杯·哈希算法