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

相关推荐
sun༒20 小时前
Logback 日志框架总结:从入门到实战
单元测试·logback
happyness441 天前
如何利用 AI 自动编写单元测试(Unit Test)来捕捉隐藏的边缘情况 Bug?
人工智能·单元测试·bug
木子杳衫1 天前
Java高级进阶 | 单元测试JUnit + 反射机制实战详解
java·junit·单元测试
Dontla2 天前
冒烟测试介绍(Smoke Test、BVT构建验证测试、构建验收测试)与回归测试对比、与单元测试对比、与集成测试对比、Cypress
java·单元测试·集成测试
测试修炼手册7 天前
[测试技术] TestNG 入门与实战:分组、数据驱动与并行执行
junit·单元测试·log4j
川石课堂软件测试8 天前
安全测试|常见SQL注入攻击方式、实例及预防
服务器·数据库·sql·功能测试·测试工具·安全·单元测试
在水一缸8 天前
深入浅出 Catch2:现代 C++ 测试框架的优雅实践
开发语言·c++·单元测试·log4j·测试框架·catch2
花椒技术9 天前
AI Coding 后半程:6 类 QA Skills 如何接住测试与发布?
单元测试·ai编程·测试
疯狂打码的少年9 天前
【软件工程】软件测试阶段:单元测试与集成测试(高频对比考点)
笔记·单元测试·集成测试·软件工程
●VON9 天前
鸿蒙 PC Markdown 编辑器查找系统:大小写、整词与循环定位
华为·单元测试·编辑器·harmonyos·鸿蒙