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


















