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

相关推荐
ckjoker5 小时前
23个测试全绿,一个Token没花——LLM应用的单元测试该怎么写?
单元测试·agent
智者知已应修善业1 天前
【P12159蓝桥杯数组翻转】2025-4-24
c语言·c++·经验分享·笔记·算法·蓝桥杯
川石课堂软件测试1 天前
性能测试|Nginx中间件监控与调优
linux·python·nginx·中间件·单元测试·压力测试·harmonyos
码云数智-大飞3 天前
从 OC 平滑迁移 Swift 完整方案
职场和发展·蓝桥杯
想你依然心痛3 天前
嵌入式单元测试:Unity/CMock框架与硬件在环测试——测试驱动、桩函数
unity·单元测试·游戏引擎
fzm52984 天前
车载ECU单元测试技术与应用研究
c语言·自动化测试·单元测试·嵌入式·白盒测试
许彰午21 天前
39_Java单元测试JUnit入门
java·junit·单元测试
嘿黑嘿呦21 天前
chap 8排序
算法·蓝桥杯·排序算法·软件工程
果子耶耶21 天前
让大模型帮我写单元测试,5个模型的覆盖率和边界处理能力实测
chatgpt·单元测试