单元测试—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);
    }
}

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

  • 28
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SmoothSailingT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值