單元測試—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.pswp.cn/web/12985.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12985.shtml
英文地址,請注明出處:http://en.pswp.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…

react 渲染引擎經歷了那些迭代

React 渲染引擎經歷了多個迭代&#xff0c;主要集中在改進 Virtual DOM 的實現和優化渲染性能方面。以下是一些 React 渲染引擎的主要迭代&#xff1a; React Fiber 架構&#xff1a;React 16 引入了 Fiber 架構&#xff0c;這是一個重新實現的渲染引夠更好地支持異步渲染。 S…

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;…

Delphi7:SuperObject 的示例

SuperObject 不是一個 Delphi 7 自帶或官方的庫&#xff0c;但可能是指一些開源的 JSON 解析庫&#xff0c;比如 superobject 或 dwscript 中的 SuperObject。這些庫通常用于解析和生成 JSON 數據。 以下是一個基于假設的 SuperObject 用法概述&#xff0c;因為不同的庫可能有…

波搜索算法(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 則允許經…