说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!
如果觉得我的文章对您有用,请随意打赏,您的支持将鼓励我继续创作:WeChat丶Alipay丶Add me
目录
一、为什么要做单元测试,以及适用项目
1.回顾
说明:测试方法中的白盒测试就是本项目的单元测试
2.价值
提前介入测试,发现代码级别的bug
3.适用项目
1.大型的、项目周期长
2.新系统、新团队
3.涉及财产、生命的项目
二、UT开展
1.UT计划
1.确定单元测试范围
1)依据标准:二八原则
20%的代码中隐藏了80%的缺陷
2)如何确定20%的代码
使用频率:高
复用性:全新的丶部分复用丶全部复用
开发人员背景:技术(强 一般 弱)丶业务(熟悉 一般 不熟)
复杂度:一般认为复杂度在7级以上的为20%的代码
- 优先级高的那么也就是那20%的代码,当对项目某个模块进行单元测试时,则需要进行制测试范围表进行如下分析
2.确定评估标准
逻辑覆盖率:
1)语句覆盖率
什么是语句:非分支,分判断
计算方式:被测的语句/全部的语句
- 示例:通过代码实现用户输入一个数字,判断是否大于0,如果大于0那么对该数字-1,否则+1
- 将如上代码编写流程图
- 从流程图中开始到结束,通过语句覆盖率的计算方式,那么当给定一个数字3时,来计算语句覆盖率,需要注意的是语句表示的是非分支和非判断,所以在流程图中一共有3个语句分别是输入数字丶执行-1操作丶执行+1操作,即输入3时语句覆盖率为2/3,同理输入-1时也是一样的
2)分支覆盖率
分支:if语句的两个分支
计算方式:被测试的分支个数/全部的分支个数
- 当输入特定数字5时,那么到if判断总共为2个分支,所以5>0为一条分支,即覆盖率为1/2
3)条件覆盖率
什么是条件:结果为True或者False
计算方式:被测条件数/全部条件数
- 当输入特定数字3时,if判断条件数为2个,3>0为1个,所以条件覆盖率为1/2
- 案例1:用代码实现登录功能用户名和密码的判断
- 画出登录功能流程图
- 当输入正确的用户名和密码时,那么条件覆盖率为2/4,因为会进行两次判断;当输入错误的用户名和正确密码时,那么条件覆盖率为1/4,因为当用户名错误时就不会进行密码的判断,所以只有1次判断;当输入正确用户名和错误密码时,那么条件覆盖率为2/4,因为用户名正确就会继续判断密码所以是两次
- 如果将if判断条件中的and改为or之后,那么就是用户名或密码只有有一个正确,则满足条件登录成功;所以第一种输入数据的条件覆盖率为1/4,第二种为2/4,因为用户名不正确判断第一次,接着判断密码,一共两次,所以条件覆盖率为2/4;最后一种输入数据条件覆盖率为1/4
- 案例2:根据如下流程图给出特定数据分析条件覆盖率
- 当输入a=6,b=6时那么在第一个判断条件下第一个a>5不满足则不会再去判断b<5这个条件,因为是and,即为一个条件,那么第一个条件不成立时则进入第二条件判断,a==5不满足又去判断b<10这个条件,即为2个条件,总共三个,那么测试覆盖率为3/8;当a=6,b=3和a=6,b=6也是这样进行分析的,所以条件覆盖率为2/8和4/8
- 案例3:根据如下流程图给出特定数据分析条件覆盖率
- 当用户名为admin 密码为123456时,进入第一个if判断时,第一个条件username满足,判断第二条件passwd也满足,即判断了两个条件;进入第二个if判断,第一个条件username不满足,则不会去判断passwd,所以只判断了一个条件,总的判断了3个条件,一共有八个条件,所以最终条件覆盖率为3/8
4)路径覆盖率
什么是路径:从开始到结束的过程
计算公式:被测路径数/全部路径数
- 在案例1中输入用户名和密码为正确的,其路径覆盖率为1/2,全部路径数为2,也就是从开始——失败——结束和开始——成功——结束,输入正确的用户名密码则被测路径数为1,所以为1/2
- 在案例2中统计路径覆盖率,那么可以得出一个结论是路径覆盖率的分子都是1,需要分析出总的路径
5)分支-条件覆盖率
分支-条件:分支和条件的组合
计算方式:被测分支数+被测条件数/全部分支数+全部条件数
- 在案例1中首先分析出分支覆盖率和条件覆盖率,然后将分支覆盖率的分子与条件覆盖率的分子相加去除以分支覆盖率的分母与条件覆盖率的分母之和,最终得出分支-条件覆盖率
- 在案例2中输入数据a=6b=6,算出分支-条件覆盖率,那么首先需要计算出分支覆盖率和条件覆盖率;分支覆盖率:总的分支为4条,被测试的分支为2条,当a=6时b=6是第一个判断条件不成立,所以走第二个判断条件这是第一个分支,在第二个判断条件中输入数据a=6b=6满足b<10所以走的语句4这个分支,即一共被测的分支为2条,所以分支覆盖率为2/4;条件覆盖率:总的条件为8个,被测试的条件为4个即为TFFT,也就是在第一个判断条件中a>5满足测试b<5不满足,在第二个判断条件中则是a==5不满足测试b<10满足,所以是4个,那么条件覆盖率为4/8;根据分支覆盖率和条件覆盖率分子相加分母相加,最终得出的分支-条件覆盖率为6/12
- 在案例3中分别计算出语句覆盖率丶分支覆盖率丶条件覆盖率丶路径覆盖率以及分支-条件覆盖率
2.UT设计
测试策略
1.自顶向下
从最上层函数开始逐层开展测试:
注意:需要对函数中调用的函数打桩(模拟调用的函数)
测试成本高
- 示例:在代码中实现了两个数字之间的加法和减法运算,在加法方法中调用了减法函数,但测试时候只想测试加法
- 所以就需要模拟减法的方法,即就是打桩,比如当开发人员还没有写完余下代码时而你要进行测试,那么则需要模拟函数中调用的函数,完成函数的测试,但是当一个函数中有很多调用时,那么打桩的工总量就很大,测试成本就很高
2.自底向上
从最下层的函数开始逐层向上开展测试(也就是说等开发开发完成后)
测试周期长
3.孤立策略
选择需要进行测试函数即可
3.UT实现
1.先将测试的代码转为流程图
- 根据如下的代码制作流程图
- 流程图如下
2.将流程图转化为流图
流图中只有圈和线
圈:判定框中的条件或者一条或者多条语句
线:带有箭头指向的连接
3.确定测试路径
- 示例1:流程图——流图
通过流图描述的是程序的复杂度(圈复杂度)
路径的个数描述的就是复杂度的级别(所以上面的流图的路径为2,即复杂度为2)
- 示例2:在代码原本基础上添加else判断,画出对应的流图
- 根据以上代码画出流程图以及流图
根据示例1和示例2可以发现复杂度为条件判定数+1
- 示例3:将代码进入如下修改
- 即以上代码的流程图需要修改,但是流图与示例2的一致,因为首先都是在>0的条件下的语句并且圈的定义是:判定框中的条件或者一条或者多条语句,所以流图不变都是编号2里面
- 示例4:将代码进行如下修改
- 流程图不变,但是流图多出一条路径,因为if判断中存在两个并条件
复杂度=条件判定数+1 即:2+1=3
- 示例5:将代码中的and变为or,画出流程图以及流图
- 示例6:根据需求编写代码,输入数字两个,对其进行判断,如果同时在0-10之间,对其两个数字进行求和,如果同时在10-20之间进行求差,其他为输出输入有误,代码如下
- 根据以上代码画出流程图
- 然后根据流程图画出流图
- 示例7:编写代码实现从1+2+...+100的和,需使用while循环,代码如下
- 根据以上代码画出流程图以及对应的流图
4.编写测试用例
案例:三角形判断,判断是否是等边三角形丶等腰三角形和普通三角形,否则提示不能组成三角形
- 首先是编写代码
- 根据代码画出流程图
- 根据流程图画出流图
- 编写测试用例
来源:https://blog.csdn.net/qq_41782425/article/details/100097477