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

相关推荐
林森lsjs3 小时前
【日耕一题】5. 青春常数(17届蓝桥杯C++B组第一题)
算法·蓝桥杯
Y_Bk3 小时前
第十七届蓝桥杯C/C++A组省赛
c语言·数据结构·c++·算法·蓝桥杯
Thecozzy1 天前
单元测试 vs 手工测试:以水印功能为例
单元测试
HLAIA光子2 天前
AI Coding框架,打好TDD和SDD这两拳
单元测试·ai编程·代码规范
霸道流氓气质2 天前
Java 单元测试生成大量 Excel 测试数据实战指南
java·单元测试·excel
川石课堂软件测试2 天前
UI自动化测试|下拉选择框&弹出框&滚动条操作实践
开发语言·python·jmeter·ui·docker·单元测试·harmonyos
川石课堂软件测试3 天前
UI自动化测试|元素操作&浏览器操作实践
功能测试·测试工具·mysql·ui·docker·容器·单元测试
无聊的老谢3 天前
电信系统中的单元测试策略:构建高可靠性的微服务防线
数据库·微服务·单元测试
wh_xia_jun3 天前
单元测试 + Mockito 开发指南
oracle·单元测试·log4j
2601_961845424 天前
高考真题试卷电子版|2025高考全科试卷分类下载
考研·面试·蓝桥杯·远程工作·程序员创富·高考