单元测试—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) {
//计算 BMIbmi = 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 类型,则返回 Truewhile (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) {
//计算 BMIbmi = 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;}//测试用例 1public 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();}//测试用例 2public 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();}//测试用例 3public 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();}
//测试用例 14public 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; //创建被测类@Testpublic void getBMIType() {
//创建被测对象testobj=new BMI(48.91,1.62);String expected="正常";
//System.out.println(testobj.getBMIType());
//调用测试方法,并校验测试结果assertTrue(testobj.getBMIType()==expected);testobj=null;}@Testpublic void getBMIType_Normal() {
//创建被测对象testobj=new BMI(69.12,1.70);String expected="正常";
//调用测试方法,并校验测试结果assertTrue(testobj.getBMIType()==expected);testobj=null;}@Testpublic void getBMIType_Thin() {
//创建被测对象testobj=new BMI(68.55,1.69);String expected="过重";
//调用测试方法,并校验测试结果assertTrue(testobj.getBMIType()==expected);testobj=null;
}
@Testpublic void getBMIType_SlightlyFat() {
//创建被测对象
testobj=new BMI(71.32,1.72);String expected="过重";
//调用测试方法,并校验测试结果assertTrue(testobj.getBMIType()==expected);
//释放对象testobj=null;}@Testpublic 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;@Beforepublic void setUp() {System.out.println("Run @Before method");testobj = new BMI();}@Afterpublic void tearDown() {System.out.println("Run @After method");testobj = null;}@BeforeClasspublic static void prepareEnvironment() {System.out.println("Run @BeforeClass Method");}@AfterClasspublic static void RestoreEnvironment() {System.out.println("Run @AfterClass Method");}@Testpublic void getBMIType() {
//创建被测对象testobj.setParams(55.0, 1.6);String expected = "正常";
//System.out.println(testobj.getBMIType());
//调用测试方法,并校验测试结果assertTrue(testobj.getBMIType() == expected);
}
@Testpublic void getBMIType_Normal() {
//赋值被测对象testobj.setParams(55.0, 1.6);String expected = "正常";
//调用测试方法,并校验测试结果assertTrue(testobj.getBMIType() == expected);}
@Testpublic void getBMIType_Thin() {
//赋值被测对象testobj.setParams(45.0, 1.6);String expected = "偏瘦";
//调用测试方法,并校验测试结果assertTrue(testobj.getBMIType() == expected);}@Testpublic void getBMIType_SlightlyFat() {
//赋值被测对象testobj.setParams(55.0, 1.6);String expected = "正常";
//调用测试方法,并校验测试结果assertTrue(testobj.getBMIType() == expected);}@Testpublic void getBMIType_Fat() {
//赋值被测对象testobj.setParams(80.0, 1.6);String expected = "肥胖";
//调用测试方法,并校验测试结果assertTrue(testobj.getBMIType() == expected);}
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日5题Day3 - LeetCode 11 - 15

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxArea(int[] height) {//这道题比较特殊&#xff0c;因为两边是任意…

04、SpringBoot 源码分析 - SpringApplication启动流程四

SpringBoot 源码分析 - SpringApplication启动流程四 初始化基本流程SimpleApplicationEventMulticaster的multicastEvent广播事件resolveDefaultEventType获取ResolvableType实例ResolvableType的forInstance创建ResolvableType实例 开始广播AbstractApplicationEventMulticas…

脉冲水路清洗机,全自动脉冲技术清除管道堵塞

邦注脉冲水路清洗机是一种高效的清洗设备&#xff0c;它利用全自动脉冲技术来清除管道内的堵塞和污垢。以下是对该设备的一些详细描述&#xff1a; 全自动脉冲技术&#xff1a;脉冲水路清洗机采用了全自动脉冲技术&#xff0c;这是一种先进的清洗方法。该技术通过产生高强度的…

window10下安装ubuntu系统以及docker使用

window10下安装ubuntu系统以及docker使用 1. 启用适用于Linux的Windwos子系统2.下载Linux内核更新包3.将 WSL 2 设置为默认版本4.安装Ubuntu<br />直接去Microsoft store里面直接搜索Ubuntu进行安装。5.可能出现的问题1.win10启动ubuntu报错 参考的对象类型不支持尝试的操…

Linux|基础环境开发工具使用(1)

目录 Linux 软件包管理器 yum 什么是软件包 关于 rzsz 注意事项 查看软件包 如何安装软件 如何卸载软件 Linux编辑器-vim介绍 vi与vim的相同点 vi与vim区别 Linux 软件包管理器 yum 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译…

【WebGPU】WebGPU 中的反应扩散计算着色器

在本教程中&#xff0c;我们将使用 WebGPU 技术中的计算着色器实现图像效果。更多精彩内容尽在数字孪生平台。 程序结构 主要构建两个 WebGPU 管道&#xff1a; 运行反应扩散算法多次迭代的计算管道&#xff08;js/rd-compute.js 和 js/shader/rd-compute-shader.js&#xff…

script标签以及defer和async属性

1. <script>标签 将JavaScript代码嵌入到HTML中主要方式是使用<script>元素。 使用<script>的方式有两种&#xff1a; &#xff08;1&#xff09;直接在网页中嵌入JavaScript代码&#xff1a; <script>function sayHi() {console.log("Hi"…

Leetcode—2244. 完成所有任务需要的最少轮数【中等】

2024每日刷题&#xff08;136&#xff09; Leetcode—2244. 完成所有任务需要的最少轮数 实现代码 class Solution { public:int minimumRounds(vector<int>& tasks) {unordered_map<int, int> map;for(int task: tasks) {map[task];}int ans 0;// freq 1 …

【前端】CSS基础(3)

文章目录 前言1. CSS常用元素属性1.1 字体属性1.1.1 字体1.1.2 字体大小1.1.3 字体颜色1.1.4 字体粗细1.1.5 文字样式 前言 这篇博客仅仅是对CSS的基本结构进行了一些说明&#xff0c;关于CSS的更多讲解以及HTML、Javascript部分的讲解可以关注一下下面的专栏&#xff0c;会持续…

c++父类指针指向子类

有一个常见的c题&#xff0c;就是父类和子类的构造函数和析构函数分别调用顺序&#xff1a; 父类构造函数子类构造函数子类析构函数父类析构函数 以及父类中的函数在子类中重新实现后&#xff0c;父类指针指向子类后&#xff0c;该指针调用的函数是父类中的还是子类中的&…

震撼发布!GPT-4o 上线!

5 月 14日凌晨一点&#xff0c;OpenAI 发布了 GPT-4o&#xff01; 新模型的功能简单概括就是&#xff1a;更快、更智能、更像人类。 秉承着持续更新的态度&#xff0c;Hulu AI 快速接入 GPT-4o 啦&#xff01; 继 5 月份上线 Suno 之后&#xff0c;这次是 Hulu AI 的又一重大…

vue3专栏项目 -- 六、上传组件(上)

1、上传组件需求分析 我们还需要新建和展示文章&#xff0c;新建文章自然是发送post请求&#xff0c;同时在post中自带对应的数据&#xff0c;展示文章就是根据id取出已有的数据并且展示出来。 这里有一个难点就是上传组件&#xff0c;上传文件是App应用中最基本的需求&#…

Socks5:网络世界的隐形斗篷

在数字化时代&#xff0c;网络隐私和安全已成为人们日益关注的话题。Socks5&#xff0c;作为一种代理协议&#xff0c;为用户在网络世界中的匿名性提供了强有力的支持。本文将从Socks5的多个方面&#xff0c;深入探讨这一技术如何成为网络世界的“隐形斗篷”。 一、Socks5的基本…

linux基础指令讲解(ls、pwd、cd、touch、mkdir)

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 总有光环在陨落&#xff0c;总有新星在闪烁 这个是我们今天要用到的初始…

P8805 [蓝桥杯 2022 国 B] 机房

P8805 [蓝桥杯 2022 国 B] 机房 分析 是一道lca题目&#xff0c;可以直接套模板 前缀和处理点权 具体思路&#xff1a; 1.n台电脑用n-1条网线相连&#xff0c;任意两个节点之间有且仅有一条路径&#xff08;拆分成各自到公共祖先节点的路径——lca&#xff09;&#xff1b;…

波搜索算法(WSA)-2024年SCI新算法-公式原理详解与性能测评 Matlab代码免费获取

​ 声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 一、初始化阶段 二、全…

我与C++的爱恋:string类的常见接口函数

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 朋友们大家好啊&#xff0c;本节我们来到STL内容的第一部分&#xff1a;string类接口函数的介绍 ​ ​ 1.string类的认识 给大家分享一个c文档 https://legacy.cplusplus.…

Weblogic 管理控制台未授权远程命令执行漏洞(CVE-2020-14882,CVE-2020-14883)

1 漏洞概述 Weblogic Pre-Auth Remote Command Execution 漏洞&#xff08;CVE-2020-14882, CVE-2020-14883&#xff09;是针对 Oracle WebLogic Server 的两个安全漏洞。CVE-2020-14882 允许远程用户绕过管理员控制台组件中的身份验证&#xff0c;而 CVE-2020-14883 则允许经…

Sam Blackshear谈Move语言的起源

Move编程语言作为Sui生态系统的关键组成部分&#xff0c;通过可编程交易区块等机制支持其独特的对象数据模型&#xff0c;并支持高效的代码。五年前&#xff0c;Mysten Labs的联合创始人兼首席技术官Sam Blackshear创建了Move。他专门设计了Move&#xff0c;用于编写智能合约&a…

sqli-labs靶场第十四关

目录 1&#xff1a;分析 找闭合符&#xff1a; 2&#xff1a;开始注入 报错注入&#xff1a; 注入数据库名&#xff1a; 注入表名&#xff1a; 注入列名&#xff1a; 注入具体值&#xff1a; 1&#xff1a;分析 经过我们的实验发现当我们输入的密码后面存在双引号时会报…