白盒测试案例
案例
编写循环程序,要求输入读入某汽车销售人员的销售数(以台 计)和每台销售的基础提成数(元)、以及销售人员工种(正式工或临时工),计算并输出他的销售提成。若销售人员销售超过40台且基础提成超过400元,则超过部分按基础提成的1.5倍的来计算。超过50台,如果是正式员工,则超过50台的部分按基础提成的2倍的来计算,否则销售提成仍按照基础提成的1.5倍的来计算。编写流程图,并使用各种逻辑覆盖法编写测试用例。
根据题目,画出需求的流程图;
根据所画流程图写出相应的程序;
/************************************************************
FileName: CalculateSalComm.cpp
Author: Switch Version : 1.0 Date: 2016-03-30
Description: 计算销售提成 // 模块描述
Function List: // 主要函数及其功能
1. main 输出销售提成
2. calculateSaleComm 计算销售提成
***********************************************************/
#include <iostream>
using namespace std;
/*************************************************
Function: calculateSaleComm // 函数名称
Description: 计算销售提成 // 函数功能、性能等的描述
Calls: // 被本函数调用的函数清单
Called By: main // 调用本函数的函数清单
Table Accessed: // 被访问的表(此项仅对于牵扯到数据库操作的程序)
Table Updated: // 被修改的表(此项仅对于牵扯到数据库操作的程序)
Input: saleNum 销售数
basicComm 基础提成数
typeOfWork 工种
Output: // 对输出参数的说明。
Return: 销售提成 // 函数返回值的说明
Others: // 其它说明
*************************************************/
float calculateSaleComm(int saleNum, float basicComm, short typeOfWork)
{
if (saleNum > 40 && basicComm > 400)
{
if (saleNum > 50 && 1 == typeOfWork)
{
return 40 * basicComm + 10 * basicComm * 1.5
+ (saleNum - 50) * basicComm * 2;
}
else
{
return 40 * basicComm + (saleNum - 40) * basicComm * 1.5;
}
}
else
{
return saleNum * basicComm;
}
}
/*************************************************
Function: mian // 函数名称
Description: 输出销售提成 // 函数功能、性能等的描述
Calls: calculateSaleComm // 被本函数调用的函数清单
Called By: // 调用本函数的函数清单
Table Accessed: // 被访问的表(此项仅对于牵扯到数据库操作的程序)
Table Updated: // 被修改的表(此项仅对于牵扯到数据库操作的程序)
Input: // 输入参数说明,包括每个参数的作
// 用、取值说明及参数间关系。
Output: // 对输出参数的说明。
Return: // 函数返回值的说明
Others: // 其它说明
*************************************************/
int main()
{
int saleNum;
float basicComm;
short typeOfWork;
cout << "请输入销售数量:";
cin >> saleNum;
cout << "请输入基础提成数:";
cin >> basicComm;
cout << "请输入工种(1:正式工,2临时工):";
cin >> typeOfWork;
/** 计算销售提成 **/
float saleComm = calculateSaleComm(saleNum, basicComm, typeOfWork);
/** 输出销售提成 **/
cout << "销售提成数为:" << saleComm << endl;
return 0;
}
分别编写各种逻辑覆盖法的测试用例,并执行测试用例,写出测试结果。
语句覆盖
主要特点:语句覆盖是最起码的结构覆盖要求,语句覆盖要求设计足够多的测试用例,使得程序中每条语句至少被执行一次。
null | 输入数据 | 路径 | 预期结果 |
---|---|---|---|
测试用例1 | saleNum=100 basicComm=1000 typeOfWork=1 | OACE | 155000 |
测试用例2 | saleNum=50 basicComm=1000 typeOfWork=1 | OADE | 55000 |
测试用例3 | saleNum=10 basicComm=1000 typeOfWork=2 | OBE | 10000 |
判定覆盖
主要特点:判定覆盖又称为分支覆盖,它要求设计足够多的测试用例,使得程序中每个判定至少有一次为真值,有一次为假值,即:程序中的每个分支至少执行一次。每个判断的取真、取假至少执行一次。
null | 输入数据 | 路径 | 预期结果 |
---|---|---|---|
测试用例1 | saleNum=100 basicComm=1000 typeOfWork=1 | OACE | 155000 |
测试用例2 | saleNum=50 basicComm=1000 typeOfWork=1 | OADE | 55000 |
测试用例3 | saleNum=10 basicComm=1000 typeOfWork=2 | OBE | 10000 |
条件覆盖
主要特点:条件覆盖要求设计足够多的测试用例,使得判定中的每个条件获得各种可能的结果,即每个条件至少有一次为真值,有一次为假值。
null | 输入数据 | 条件真假值 | 路径 | 预期结果 |
---|---|---|---|---|
测试用例1 | saleNum=100 basicComm=1000 typeOfWork=1 | saleNum>40 T basicComm>400 T saleNum> 50 T typeOfWork=1 T | OACE | 155000 |
测试用例2 | saleNum=10 basicComm=100 typeOfWork=2 | saleNum>40 F basicComm>400 F saleNum> 50 F typeOfWork=1 F | OBE | 1000 |
判定/条件覆盖
主要特点:设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身所有可能结果也至少出现一次。
null | 输入数据 | 条件真假值 | 路径 | 预期结果 |
---|---|---|---|---|
测试用例1 | saleNum=100 basicComm=1000 typeOfWork=1 | saleNum>40 T basicComm>400 T saleNum> 50 T typeOfWork=1 T | OACE | 155000 |
测试用例2 | saleNum=10 basicComm=100 typeOfWork=2 | saleNum>40 F basicComm>400 F saleNum> 50 F typeOfWork=1 F | OBE | 1000 |
测试用例3 | saleNum=100 basicComm=1000 typeOfWork=2 | saleNum>40 T basicComm>400 T saleNum> 50 T typeOfWork=1 F | OADE | 130000 |
组合/条件覆盖
主要特点:要求设计足够多的测试用例,使得每个判定中条件结果的所有可能组合至少出现一次。
null | 输入数据 | 条件真假值 | 路径 | 预期结果 |
---|---|---|---|---|
测试用例1 | saleNum=100 basicComm=1000 typeOfWork=1 | saleNum>40 T basicComm>400 T saleNum> 50 T typeOfWork=1 T | OACE | 155000 |
测试用例2 | saleNum=100 basicComm=1000 typeOfWork=2 | saleNum>40 T basicComm>400 T saleNum> 50 T typeOfWork=1 F | OADE | 130000 |
测试用例3 | saleNum=50 basicComm=1000 typeOfWork=1 | saleNum>40 T basicComm>400 T saleNum> 50 F typeOfWork=1 T | OADE | 55000 |
测试用例4 | saleNum=50 basicComm=1000 typeOfWork=2 | saleNum>40 T basicComm>400 T saleNum> 50 F typeOfWork=1 F | OADE | 55000 |
测试用例5 | saleNum=100 basicComm=100 typeOfWork=1 | saleNum>40 T basicComm>400 F saleNum> 50 T typeOfWork=1 T | OBE | 10000 |
测试用例6 | saleNum=100 basicComm=100 typeOfWork=2 | saleNum>40 T basicComm>400 F saleNum> 50 T typeOfWork=1 F | OBE | 10000 |
测试用例7 | saleNum=50 basicComm=100 typeOfWork=1 | saleNum>40 T basicComm>400 F saleNum> 50 F typeOfWork=1 T | OBE | 5000 |
测试用例8 | saleNum=50 basicComm=100 typeOfWork=2 | saleNum>40 T basicComm>400 F saleNum> 50 F typeOfWork=1 F | OBE | 5000 |
测试用例9 | 输入数据不存在 | saleNum>40 F basicComm>400 T saleNum> 50 T typeOfWork=1 T | 路径不存在 | 无 |
测试用例10 | 输入数据不存在 | saleNum>40 F basicComm>400 T saleNum> 50 T typeOfWork=1 F | 路径不存在 | 无 |
测试用例11 | saleNum=10 basicComm=1000 typeOfWork=1 | saleNum>40 F basicComm>400 T saleNum> 50 F typeOfWork=1 T | OBE | 10000 |
测试用例12 | saleNum=10 basicComm=1000 typeOfWork=2 | saleNum>40 F basicComm>400 T saleNum> 50 F typeOfWork=1 F | OBE | 10000 |
测试用例13 | 输入数据不存在 | saleNum>40 F basicComm>400 F saleNum> 50 T typeOfWork=1 T | 路径不存在 | 无 |
测试用例14 | 输入数据不存在 | saleNum>40 F basicComm>400 F saleNum> 50 T typeOfWork=1 F | 路径不存在 | 无 |
测试用例15 | saleNum=10 basicComm=100 typeOfWork=1 | saleNum>40 F basicComm>400 F saleNum> 50 F typeOfWork=1 T | OBE | 1000 |
测试用例16 | saleNum=10 basicComm=100 typeOfWork=2 | saleNum>40 F basicComm>400 F saleNum> 50 F typeOfWork=1 F | OBE | 1000 |
基本路径覆盖
主要特点:设计足够的测试用例,覆盖程序中所有可能的路径。
虽然没画出控制流图,但是根据上面的程序流程图,也能得出环形复杂度。
环形复杂度V(G)=关键点+1=3
null | 输入数据 | 路径 | 预期结果 |
---|---|---|---|
测试用例1 | saleNum=100 basicComm=1000 typeOfWork=1 | OACE | 155000 |
测试用例2 | saleNum=50 basicComm=1000 typeOfWork=1 | OADE | 55000 |
测试用例3 | saleNum=10 basicComm=1000 typeOfWork=2 | OBE | 10000 |