先解释一下Assert
本质上,是一个封装好的 if 语句.返回值为void.传入形参为 (预期值,待测值,允许误差范围)
调用时,打印错误信息,比如
对于float类型的形参而言,Δ是必须的.否则调用一个废弃的assertEqual().
1.需求:
佣金函数commision(int,int,int);
需求是: commission方法是用来计算销售佣金的需求
有耳机(headphone)、手机壳(Mobile phone shell)、手机贴膜(Cellphone screen protector)三个部件,
每个部件单价为:耳机80元,手机壳10元,手机贴膜8元,每月月末向制造商报告销量,制造商根据销量给销售商佣金。
如果销售额不足1000元按10%提取佣金,1000-1800元部分按15%提取佣金,超过1800元部分按20%提取佣金。
2.源代码
package com.company;
//佣金函数
public class Commision {
float total; //记录总销售额
float saraly; //记录要发的佣金(返回值)
public float commosion(int headphone, int shell, int protector) {
if (headphone<0||shell<0||protector<0){
return (float)-1;
}
total = 80 * headphone + 10 * shell + 8 * protector;
if (total <= 1000) {
saraly = (float)0.1 * total;
} else if (total <= 1800 && total > 1000) {
saraly = 100 + (float)0.15 * (total - 1000);
} else {
saraly = 100*(float)0.1+800*(float)0.15+(total-1800)*(float)0.2;
}
return saraly;
}
}
二.流程图
三.测试用例的编写
1.
1.语句覆盖
路径 |
要求 |
测试用例 |
预期结果 |
SABDE |
total<=1000 |
(1,1,1) |
9.8 |
SABCFE |
1000 |
(10,30,5) |
121.0 |
SABCGE |
total>1800 |
(100,150,100) |
1830.0 |
测试代码:
@Test //语句覆盖
public void Commosion_state() throws Exception {
//期望值,实际值,允许误差.该断言接收double形参时必加delta,否则调用一个被弃用的断言函数
assertEquals(9.8, cc.commosion(1, 1, 1), 0.01);
assertEquals(121.0, cc.commosion(10, 30, 5), 0.01);
assertEquals(1830, cc.commosion(100, 150, 100), 0.01);
}
2.路径覆盖
路径 |
要求 |
测试用例 |
预期结果 |
SABDE |
total<=1000 |
(1,1,1) |
9.8 |
SABCFE |
1000 |
(10,30,5) |
121.0 |
SABCGE |
total>1800 |
(100,150,100) |
1830.0 |
测试代码:
@Test //路径覆盖 public void Commosion_path() { assertEquals(9.8, cc.commosion(1, 1, 1), 0.01); assertEquals(121.0, cc.commosion(10, 30, 5), 0.01); assertEquals(1830, cc.commosion(100, 150, 100), 0.01); }
3.判定覆盖
路径 |
要求 |
测试用例 |
预期结果 |
SABCGE |
total>1800 |
(100,150,100) |
1830.0 |
测试代码:
@Test //判定覆盖 public void Commosion_dec() { assertEquals(1830, cc.commosion(100, 150, 100), 0.01); }
4.条件覆盖
三个条件B1,C1,C2
条件 |
路径 |
要求 |
测试用例 |
预期结果 |
|
B1=T |
SABDE |
total<=1000 |
(1,1,1) |
9.8 |
|
B1=F C1=T,C2=F |
SABCGE |
Total>1000&& total>1800 |
(200,200,200) |
3690 |
|
B1=F C1=F,C2=T |
SABCGE |
Total<1000&& total>1800 |
不存在 |
--- |
测试代码:
@Test //条件覆盖 public void Commosion_con() { assertEquals(9.8, cc.commosion(1, 1, 1), 0.01); assertEquals(3690.0, cc.commosion(200, 200, 200), 0.01); }
5.判定/条件覆盖
两个判定B,C.三个条件B1,C1,C2
B=T B1=T
C=F C1=T C2=F
判定 |
条件 |
路径 |
要求 |
测试用例 |
预期结果 |
B=T |
B1=T |
SABDE |
total<=1000 |
(1,1,1) |
9.8 |
B=F,C=T |
B1=F,C1=F,C2=T |
---- |
Total<=1000&& Total>1800 |
--- |
--- |
B=F,C=F |
B1=F,C1=T,C2=F |
SABCGE |
total>1800 |
(100,150,100) |
1830.0 |
@Test //判定/条件覆盖 public void Commosion_dec_con() {
assertEquals(9.8, cc.commosion(1, 1, 1), 0.01);
assertEquals(3690.0, cc.commosion(200, 200, 200), 0.01);
}
6.条件组合覆盖
判定B可能出现的条件组合为:B=T,B=F
判定C可能出现的条件组合为:
C1=T,C2=F
C1=F,C2=T
C1=T,C2=T
C1=F,C2=F
设计测试用例
条件 |
路径 |
要求 |
测试用例 |
预期结果 |
|
B=T |
SABDE |
total<=1000 |
(1,1,1) |
9.8 |
|
B=F C1=F,C2=T |
不存在 |
total<=1000&& total>1800 |
------ |
------ |
|
B=F C1=T,C2=F |
SABCGE |
total>1800 |
(100,150,100) |
1830.0 |
|
B=F C1=T,C2=T |
SABCFE |
1000 |
(10,30,5) |
121.0 |
|
B=F C1=F,C2=F |
不存在 |
Total<=1000&& Total>1800 |
------ |
------
|
测试代码:
@Test //条件组合覆盖
public void ommosion_mul_con() {
assertEquals(9.8, cc.commosion(1, 1, 1), 0.01);
assertEquals(121.0, cc.commosion(10, 30, 5), 0.01);
assertEquals(1830.0, cc.commosion(100, 150, 100), 0.01);