单元测试—BMI脚本设计

BMI例题如下:

BMI中国计算标准:体质指数(BMI)=体重(kg)÷身高^2(m)

例如:一个人的身高为1.75米,体重为68千克,他的BMI=68/(1.75^2)=22.2(千克/米^2)当BMI指数为18.5~23.9时属正常。

成人的BMI数值标准:

过轻:低于18.5         正常:>=18.5且<24

过重:>=24且<28        肥胖:>=28且<32

非常肥胖:>=32

1步:在IEDA环境下完成BMI的代码实现

方案1:通过键盘输入身高,体重或者直接通过构造方法或者BMI类的成员方法初始化身高体重,然后调用方法计算BMI值,并人工判断校验。

package sample;
import java.util.Scanner;
import java.text.DecimalFormat;
import static java.lang.Math.abs;
public class BMI {
    double height; //身高
    double weight; //体重
    //设置和得到属性值
    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
}
//构造函数
    public BMI(double w, double h) {
        weight = w;
        height = h;
    }

    //设置体重和身高
    public void setParams(double w, double h) {
        weight = w;
        height = h;
    }
//根据 BMI 值判断健康状况
    public String getBMIType() {
        double bmi = 0.0;
        String result = "";
//设置浮点数输出格式,保留 2 位小数
        DecimalFormat df = new DecimalFormat("#.00");
        if (weight > 0 && height > 0) {
//计算 BMI
            bmi = weight / (height * height);
//2、根据 bmi 判断所属健康分类
            if (bmi < 18.5) {
                result = "偏瘦";
            } else if (bmi < 24) {
                result = "正常";
            } else if (bmi < 28) {
                result = "过重";
            }else if (bmi < 32) {
                result = "肥胖";
            }else {
                result = "非常肥胖";
            }        } else {
            return "重量或者身高错误!";
        }
        System.out.println("bmi 的值是:" + df.format(bmi));
        return result;
    }

public static void main(String[] args) {
//方案 1
//用户输入体重和身高,调用被测方法,结果输出到屏幕
//得到一个扫描对象,从键盘接收数据
        Scanner reader = new Scanner(System.in);
        double w = 0.0, h = 0.0;
        System.out.println("请输入体重(公斤)和身高(米),以等号=结束");
        //检测到下一个数为 Double 类型,则返回 True
        while (reader.hasNextDouble()) {
            w = reader.nextDouble();
            h = reader.nextDouble();
        }
BMI testobj = new BMI(w, h);
        String result = testobj.getBMIType();
        String output = "体重:" + w + ",身高:" + h + ",BMI 状况是:" + result;
        System.out.println(output);
        //设置多个测试用例
        BMI tmpobj = new BMI(45.0, 1.6);
        String type = tmpobj.getBMIType();
        System.out.println(type);
        tmpobj.setParams(55, 1.6);
        System.out.println(tmpobj.getBMIType());
        tmpobj.setParams(68, 1.6);
        System.out.println(tmpobj.getBMIType());
        tmpobj.setParams(80, 1.6);
        System.out.println(tmpobj.getBMIType());
  }
}

根据自身实际问题再做修改。

2步:针对BMI类设计测试用例

输入

BMI值

等价类/边界值

预期输出

用例编号

体重(KG)

身高(M)

1

59.95

1.80

18.5

等于边界值18.5

正常

2

46.24

1.70

16

输出等价类小于18.5

过轻

3

0

1.70

输入体重边界值0

输入有误

4

48.91

1.62

18.6

输出等价类大于18.5

正常

5

69.12

1.70

23.9

输出等价类小于24

正常

6

68.55

1.69

24.0

等于边界值24

过重

7

71.32

1.72

24.1

输出等价类大于24

过重

8

82.56

1.72

27.9

输出等价类小于28

过重

9

79.10

1.68

28.0

等于边界值28

肥胖

10

80.31

1.69

28.1

输出等价类大于28

肥胖

11

93.31

1.71

31.9

输出等价类小于32

肥胖

12

88.20

1.66

32.0

等于边界值32

非常肥胖

13

88.50

1.66

32.1

输出等价类大于32

非常肥胖

14

100.04

1.69

35.0

输出等价类大于32

非常肥胖

15

60.00

0

输入身高边界值0

输入有误

16

200.00

1.7

69.2

无效等价类超出正常体重

输入有误

17

60.00

2.50

9.6

无效等价类超出正常身高

输入有误

18

60.00

0.90

74.1

无效等价类低于正常身高

输入有误

设计用例不多,可以再自行增加边界值用例。

第3

方案2是在方案1的基础上改进,将预期值和计算的BMI值进行比较,实现自动校验。

package sample;
import java.util.Scanner;
import java.text.DecimalFormat;
import static java.lang.Math.abs;
public class BMI {
    double height; //身高
    double weight; //体重
    //设置和得到属性值
    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
}
//构造函数
    public BMI(double w, double h) {
        weight = w;
        height = h;
    }

    //设置体重和身高
    public void setParams(double w, double h) {
        weight = w;
        height = h;
    }
//根据 BMI 值判断健康状况
    public String getBMIType() {
        double bmi = 0.0;
        String result = "";
//设置浮点数输出格式,保留 2 位小数
        DecimalFormat df = new DecimalFormat("#.00");
        if (weight > 0 && height > 0) {
//计算 BMI
            bmi = weight / (height * height);
//2、根据 bmi 判断所属健康分类
            if (bmi < 18.5) {
                result = "偏瘦";
            } else if (bmi < 24) {
                result = "正常";
            } else if (bmi < 28) {
                result = "过重";
            }else if (bmi < 32) {
                result = "肥胖";
            }else {
                result = "非常肥胖";
            }        } else {
            return "重量或者身高错误!";
        }
        System.out.println("bmi 的值是:" + df.format(bmi));
        return result;
    }

public static void main(String[] args) {
//方案 2:脚本自行根据测试用例来设置体重和身高,并自动校验执行结果
//1、创建被测对象
BMI testobj=new BMI(48.91,1.62);
    //2、调用被测方法
    String actual=testobj.getBMIType();
    //3、校验执行结果
    String expected="正常";
    String output="";
if(actual==expected)
    { output+="pass";
    }else
    { output+="Fail,体重:48.91,身高 1.62,Expected:"+expected+",Actual:"+actual;
    }output+="\n";
//测试用例 2
testobj.setParams(69.12,1.70); actual=testobj.getBMIType(); expected="正常";
if(actual==expected)
    {
        output+="pass";
    }else
    { output+="Fail,体重:69.12,身高 1.70,Expected:"+expected+",Actual:"+actual;
    }output+="\n";
//测试用例 3
testobj.setParams(68.55,1.69); actual=testobj.getBMIType(); expected="过重";
if(actual==expected)
    { output+="pass";
    }else
    { output+="Fail,体重:68.55,身高 1.69,Expected:"+expected+",Actual:"+actual;
    }output+="\n";
//测试用例 4
testobj.setParams(71.32,1.72); actual=testobj.getBMIType(); expected="过重";
if(actual==expected)
    { output+="pass";
    }else
 { output+="Fail,体重:71.32,身高 1.72,Expected:"+expected+",Actual:"+actual;
    }output+="\n";
//4、输出结果
System.out.println(output);
    }
}

第4

先另外创建一个TestBMI类,在方案1和方案2基础上做如下改进:

方案3代码如下:

package sample;
import static java.lang.Math.abs;
class TestBMI {
    BMI bmiObj; //被测类
    //创建被测对象
    public void createTestobj(double w, double h) {
        bmiObj = new BMI(w, h);
    }
    //释放被测对象
    public void freeTestobj() {
        bmiObj = null;
    }
//执行结果校验
    public boolean verify(String expected, String actual) {
        if (expected == actual) { return true;
        } else {return false;
        }
    }
    //记录执行过程
    public String record(double w, double h, String expected, String actual, boolean testResult) {
        String output = "";
        if (testResult) { output += "Pass. 体重:" + w + ", 身高:" + h;
        } else {output += "Fail. 体重:" + w + ", 身高:" + h +
                ", Expected:" + expected + ", Actual:" + actual;
        }return output;
    }
    //测试用例 1
    public void testGetBMIType1() { createTestobj(48.91, 1.62);
        String actual = bmiObj.getBMIType();
        boolean testResult = verify("正常", actual);
        System.out.println(record(48.91, 1.62, "正常", actual, testResult));
        freeTestobj();
    }
    //测试用例 2
    public void testGetBMIType2() { createTestobj(69.12, 1.70);
        String actual = bmiObj.getBMIType();
        boolean testResult = verify("正常", actual);
        System.out.println(record(69.12, 1.70, "正常", actual, testResult));
        freeTestobj();
    }
    //测试用例 3
    public void testGetBMIType3() { createTestobj(68.55, 1.69);
        String actual = bmiObj.getBMIType();
        boolean testResult = verify("过重", actual);
        System.out.println(record(68.55, 1.69, "过重", actual, testResult));
        freeTestobj();
    }
//测试用例 14
    public void testGetBMIType4() { createTestobj(71.32, 1.72);
        String actual = bmiObj.getBMIType();
        boolean testResult = verify("过重", actual);
        System.out.println(record(71.32, 1.72, "过重", actual, testResult));
        freeTestobj();
    }
    //主函数
    public static void main(String[] args) {
        TestBMI test = new TestBMI();
        test.testGetBMIType1();
        test.testGetBMIType2();
        test.testGetBMIType3();
        test.testGetBMIType4();
    }
}

5步:BMI类下创建BMITest类进行独立测试

测试结果如下:

代码如下:

package sample;
import org.junit.Test;
import static org.junit.Assert.*;
public class BMITest {
    BMI testobj; //创建被测类
    @Test
    public void getBMIType() {
//创建被测对象
        testobj=new BMI(48.91,1.62);
        String expected="正常";
//System.out.println(testobj.getBMIType());
//调用测试方法,并校验测试结果
        assertTrue(testobj.getBMIType()==expected);
        testobj=null;
    }
    @Test
    public void getBMIType_Normal() {
//创建被测对象
        testobj=new BMI(69.12,1.70);
        String expected="正常";
//调用测试方法,并校验测试结果
        assertTrue(testobj.getBMIType()==expected);
        testobj=null;
    }
    @Test
    public void getBMIType_Thin() {
//创建被测对象
        testobj=new BMI(68.55,1.69);
        String expected="过重";
//调用测试方法,并校验测试结果
        assertTrue(testobj.getBMIType()==expected);
        testobj=null;
}
@Test
    public void getBMIType_SlightlyFat() {
//创建被测对象
testobj=new BMI(71.32,1.72);
        String expected="过重";
//调用测试方法,并校验测试结果
        assertTrue(testobj.getBMIType()==expected);
//释放对象
        testobj=null;
    }
    @Test
    public void getBMIType_Fat() {
//创建被测对象
        testobj=new BMI(79.1,1.68);
        String expected="肥胖";
//调用测试方法,并校验测试结果
        assertTrue(testobj.getBMIType()==expected);
        testobj=null;
    }
}

第6步:BMI类创建BMITest1类,使用Before和After方法进行独立测试

测试结果如下:

代码如下:

package sample;
import org.junit.*;
import static org.junit.Assert.*;
public class BMITest1 {
    BMI testobj;
    @Before
    public void setUp() {
        System.out.println("Run @Before method");
        testobj = new BMI();
    }
    @After
    public void tearDown() {
        System.out.println("Run @After method");
        testobj = null;
    }
    @BeforeClass
    public static void prepareEnvironment() {
        System.out.println("Run @BeforeClass Method");
    }
    @AfterClass
    public static void RestoreEnvironment() {
        System.out.println("Run @AfterClass Method");
    }
    @Test
    public void getBMIType() {
//创建被测对象
        testobj.setParams(55.0, 1.6);
        String expected = "正常";
//System.out.println(testobj.getBMIType());
//调用测试方法,并校验测试结果
        assertTrue(testobj.getBMIType() == expected);
}
@Test
    public void getBMIType_Normal() {
//赋值被测对象
        testobj.setParams(55.0, 1.6);
        String expected = "正常";
//调用测试方法,并校验测试结果
        assertTrue(testobj.getBMIType() == expected);
    }
@Test
    public void getBMIType_Thin() {
//赋值被测对象
        testobj.setParams(45.0, 1.6);
        String expected = "偏瘦";
//调用测试方法,并校验测试结果
        assertTrue(testobj.getBMIType() == expected);
    }
    @Test
    public void getBMIType_SlightlyFat() {
//赋值被测对象
        testobj.setParams(55.0, 1.6);
        String expected = "正常";
//调用测试方法,并校验测试结果
        assertTrue(testobj.getBMIType() == expected);
    }
    @Test
    public void getBMIType_Fat() {
//赋值被测对象
        testobj.setParams(80.0, 1.6);
        String expected = "肥胖";
//调用测试方法,并校验测试结果
        assertTrue(testobj.getBMIType() == expected);
    }
}

代码根据需求或用例自行修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/633383.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【堡垒机小知识】堡垒机和接口机的重要区别分析

在企业IT架构管理中&#xff0c;接口机和堡垒机各自扮演着不可或缺的角色。但不少IT小伙伴对于两者不是很了解&#xff0c;不知道两者之间有什么区别&#xff0c;今天我们就来一起分析一下。 堡垒机和接口机的重要区别分析 1、功能区别 接口机主要用于数据库层面的数据交换和…

构建进攻性的网络安全防护策略

进攻性安全&#xff08;Offensive security&#xff09;是指一系列主动安全策略&#xff0c;这些策略与恶意行为者在现实世界的攻击中使用的策略相同&#xff0c;区别在于其目的是加强而非损害网络安全。常见的进攻性安全方法包括红队、渗透测试和漏洞评估。 进攻性安全行动通…

【漏洞复现】用友U8 CRM uploadfile 文件上传致RCE漏洞

0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP&#xff0c;主要聚焦成长型、创新型企业&#xff0c;提供企业级云ERP整体解决方案。 0x02 漏洞概述 用友 U8 CRM客户关系管理系统 uploadfle.php 文件存在任意文件上传漏洞&#xff0c;未经身份验证的攻击者通过漏洞上传…

Go 切片常用操作与使用技巧

1.什么是切片 在 Go 语言中的切片&#xff08;slice&#xff09;是一种灵活的动态数组&#xff0c;它可以自动扩展和收缩&#xff0c;是 Go 语言中非常重要的数据结构之一。切片是基于数组实现的&#xff0c;它的底层是数组&#xff0c;可以理解为对底层数组的抽象。它会生成一…

二十五篇:嵌入式系统揭秘:基础理论与实践探索

嵌入式系统揭秘&#xff1a;基础理论与实践探索 1. 嵌入式系统的定义与特性 1.1 详细解释 嵌入式系统&#xff0c;作为一种特殊的计算机系统&#xff0c;其设计目的是为了执行一个或多个特定的功能。与通用计算机相比&#xff0c;嵌入式系统通常被集成到更大的设备中&#xf…

基于地理坐标的高阶几何编辑工具算法(8)——整形面

文章目录 工具步骤应用场景算法输入算法输出算法示意图算法原理工具步骤 选中面,点击“整形面”工具,绘制一条和面至少两个交点的线,双击结束。 应用场景 快速修改一个几何面的局部形状。 算法输入 一个待修改的面p,和一条绘制的线l 算法输出 修改后的面 算法示意图…

(Qt) 默认QtWidget应用包含什么?

文章目录 ⭐前言⭐创建&#x1f6e0;️选择一个模板&#x1f6e0;️Location&#x1f6e0;️构建系统&#x1f6e0;️Details&#x1f6e0;️Translation&#x1f6e0;️构建套件(Kit)&#x1f6e0;️汇总 ⭐项目⚒️概要⚒️构建步骤⚒️清除步骤 ⭐Code&#x1f526;untitled…

Java——抽象类与接口的区别

定义区分&#xff1a; 抽象类&#xff1a;抽象类是用来捕捉子类的通用特性的 。它不能被实例化&#xff0c;只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板 接口&#xff1a;接口是抽象方法的集合。如果一个类实现了某个接口&#xff0c;那么它就继承了这个接…

第二证券今日投资参考:5月国产游戏版号发放 猪价加速上涨

昨日&#xff0c;两市股指盘中震荡上扬&#xff0c;沪指盘中续创年内新高&#xff0c;创业板指一度涨超1%。到收盘&#xff0c;沪指涨0.54%报3171.15点&#xff0c;深证成指涨0.43%报9750.82点&#xff0c;创业板指涨0.59%报1875.93点&#xff0c;上证50指数涨0.34%&#xff1b…

我的第一个JAVA程序IDEA版

目录 第一步 新建一个空项目第二步 新建模块第三步 新建包第四步 新建类第五步 新建main方法 第一步 新建一个空项目 第二步 新建模块 第三步 新建包 第四步 新建类 然后在包文件夹下新建类 第五步 新建main方法

使用Python生成一束玫瑰花

520到了&#xff0c;没时间买花&#xff1f;我们来生成一个电子的。 Python不仅是一种强大的编程语言&#xff0c;用于开发应用程序和分析数据&#xff0c;它也可以用来创造美丽的艺术作品。在这篇博客中&#xff0c;我们将探索如何使用Python生成一束玫瑰花的图像。 准备工作…

国内快速下载hugging face大模型的方法

由于众所周知的原因&#xff0c;从hugging face下载大模型比较困难&#xff0c;幸好国内有人做了镜像站&#xff0c;可以通过国内的镜像站进行快速下载&#xff0c;以下是配置方法。 我的系统是ubuntu 22&#xff0c;这里记录的方法只对debian/ubuntu有效。 git-lfs/INSTALLI…

民国漫画杂志《时代漫画》第14期.PDF

时代漫画14.PDF: https://url03.ctfile.com/f/1779803-1247458399-6732ac?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络&#xff01;

压摆率SR、增益带宽积GBP、开环增益Aol

运放的选型对运放电路的实际效果非常关键&#xff0c;一定要理解运放重要参数的概念。下面几天将对运放的选型进行系统学习并做实验 运放的压摆率&#xff08;Slew Rate&#xff0c;简称SR&#xff09;是指闭环放大器在输入为阶跃信号时&#xff0c;输出电压时间变化率的平均值…

Python 全栈体系【四阶】(五十二)

第五章 深度学习 十二、光学字符识别&#xff08;OCR&#xff09; 2. 文字检测技术 2.1 CTPN&#xff08;2016&#xff09; 2.1.1 概述 CTPN全称Detecting Text in Natural Image with Connectionist Text Proposal Network&#xff08;基于连接文本提议网络的自然图像文本…

测试驱动编程(2)进阶单元测试(上)

文章目录 测试驱动编程(2)进阶单元测试&#xff08;上&#xff09;单元测试单元测试正确打开方式各类测试比较 TDD中的单元测试 测试驱动编程(2)进阶单元测试&#xff08;上&#xff09; 单元测试 要打造出出类拔萃的作品&#xff0c;你必须专注于最小的细节 单元测试正确打…

Vue3 实现共享数据三种方式

1. Vuex 1.1 安装vuex npm install vuexlatest 1.2 创建store文件夹&#xff0c;创建index.js文件 在vuex4.x中 创建vuex实例需要使用createStore方法 // store/index.js import { createStore } from vuex import useLoginStore from ./modules/loginexport default cre…

MySql--SQL语言

目录 SQl---DDL 结构定义 创建、删除 数据库 代码 运行 设计表 数据类型 整数 浮点数 主键 约束 主键自增长 默认值 字段注释 创建、删除 表 代码 运行 代码 代码 运行 SQL---DML 数据操纵 插入数据 代码 运行 代码 运行 代码 运行 代码 …

轻量音乐网站程序源码,在线音乐免费听歌

这是一个高品质的音乐共享和流媒体平台&#xff0c;用户可以在这个网站上免费在线听歌。这个轻量级的音乐网站程序源码&#xff0c;是您创建自己的音乐流媒体网站的最佳选择&#xff01;它还支持制作插件&#xff0c;并且在更新后&#xff0c;您可以保留您的自定义设置。 下 载…

LeetCode刷题之HOT100之比特位计数

今天把仙剑三看完了&#xff0c;茂茂割肉让人无法释怀&#xff0c;眼泪止不住的流。长卿和紫萱的分离似乎也意味着重逢&#xff0c;这就是他们的宿命吧。怅然若失的感觉席卷全身&#xff0c;哎&#xff0c;做题吧。 1、题目描述 2、逻辑分析 题目要求将整数从0到此元素&#…