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);}
}
代码根据需求或用例自行修改。