当前位置:网站首页>如何编写单元测试用例
如何编写单元测试用例
2022-07-04 08:56:00 【全栈程序员站长】
大家好,又见面了,我是你们的朋友全栈君。
一、单元测试的概念
单元通俗的说就是指一个实现简单功能的函数。单元测试就是只用一组特定的输入( 测试用例)测试函数是否功能正常,并且返回了正确的输出。
测试的覆盖种类
1.语句覆盖:语句覆盖就是设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次。
2.判定覆盖(也叫分支覆盖):设计若干个测试用例,运行所测程序,使程序中每个判断的取真分支和取假分支至少执行一次。
3.条件覆盖:设计足够的测试用例,运行所测程序,使程序中每个判断的每个条件的每个可能取值至少执行一次。
4.判定——条件覆盖:设计足够的测试用例,运行所测程序,使程序中每个判断的每个条件的每个可能取值至少执行一次,并且每个可能的判断结果也至少执行一次。
5.条件组合测试:设计足够的测试用例,运行所测程序,使程序中每个判断的所有条件取值组合至少执行一次。
6.路径测试:设计足够的测试用例,运行所测程序,要覆盖程序中所有可能的路径。
用例的设计方案主要的有下面几种:条件测试,基本路径测试,循环测试。通过上面的方法可以实现测试用例对程序的逻辑覆盖,和路径覆盖。
二、开始测试前的准备
在开始测试时,要先声明一下,无论你设计多少测试用例,无论你的测试方案多么完美,都不可能完全100%的发现所有BUG,我们所需要做的是用最少的资源,做最多测试检查,寻找一个平衡点保证程序的正确性。穷举测试是不可能的。所以现在进行单元测试我选用的是现在一般用的比较多的基本路径测试法。
三、开始测试
基本路径测试法:设计出的测试用例要保证每一个基本独立路径至少要执行一次。
函数说明:当i_flag=0;返回i_count+100
当i_flag=1;返回i_count*10
否则返回i_count*20
输入参数:inti_count,
inti_flag
输出参数:inti_return;
代码:
1intTest(inti_count,inti_flag) 2{ 3inti_temp=1; 4while(i_count>0) 5{ 6if(0==i_flag) 7{ 8i_temp=i_count+100; 9break; 10} 11else 12{ 13if(1==i_flag) 14{ 15i_temp=i_temp*10; 16} 17else 18{ 19i_temp=i_temp*20; 20} 21} 22i_count–; 23} 24returni_temp; 25} |
|---|
1.画出程序控制流程图
图例:
事例程序流程图:
圈中的数字代表的是语句的行号,也许有人问为什么选4,6,13,8……作为结点,第2行,第3行为什么不是结点,因为选择结点是有规律的。让我们看程序中;第2行,第3行是按顺序执行下来的。直到第4行才出现了循环操作。而2,3行没有什么判断,选择等分支操作,所以我们把2,3,4全部合并成一个结点。其他的也是照这个规则合并,然后就有了上面的流程图。
2.计算圈复杂度
有了图以后我们要知道到底我们有写多少个测试用例,才能满足基本路径测试。
这里有有了一个新概念——圈复杂度
圈复杂度是一种为程序逻辑复杂性提供定量测试的软件度量。将该度量用于计算程序的基本独立路径数目。为确保所有语句至少执行一次的测试数量的上界。
公式圈复杂度V(G)=E-N+2,E是流图中边的数量,N是流图中结点的数量。
公式圈复杂度V(G)=P+1,P是流图G中判定结点的数量。
通俗的说圈负责度就是判断单元是不是复杂,是不是好测试的标准。一般来说如果圈复杂度如果大于20就表示这个单元的可测试性不好,太复杂(也许有人觉得无所谓,但是如果你们公司实行了CMMI5的话,对这个是有规定的)。
从图中我们可以看到,
V(G)=10条边-8结点+2=4
V(G)=3个判定结点+1=4
上图的圈复杂图是4。这个结果对我们来说有什么意义呢?它表示我们只要最多4个测试用例就可以达到基本路径覆盖。
3.导出程序基本路径。
现在我们知道了起码要写4个测试用例,但是怎么设计这4个测试用例?
导出程序基本路径,根据程序基本路径设计测试用例子。
程序基本路径:基本独立路径就是从程序的开始结点到结束可以选择任何的路径遍历,但是每条路径至少应该包含一条已定义路径不曾用到的边。(看起来不好理解,让我们看例子)。
让我们看上面的流程图:从结点4到24有几条路径呢?
1B(4,24)
2C,E,J(4,6,8,24)
3C,D,F,H,A,B(4,6,13,15,22,4,24)
4C,D,G,I,A,B(4,6,13,19,22,4,24)
还有吗??
5C,D,C,I,A,C,E,J(4,6,13,19,22,4,6,8,24)算吗?
不算,为什么?因为上面的4条路径已经包括了所有的边。第5条路径已经不包含没有用过的边了。所有的路径都遍历过了。
好了,现在我们有了4条基本独立路径根据独立路径我们可以设计测试用例。
1B(4,24)
输入数据:i_count=0,或者是i_count<0的某一个值。
预期结果:i_temp=0.
2C,E,J(4,6,8,24)
输入数据:i_count=1;i_flag=0
预期结果:i_temp=101.
3C,D,F,H,A,B(4,6,13,15,22,4,24)
输入数据:i_count=1;i_flag=1
预期结果:i_temp=10.
4C,D,G,I,A,B(4,6,13,19,22,4,24)
输入数据:i_count=1;i_flag=2
预期结果:i_temp=20.
这里的输入数据是由路径和程序推论出来的。而要注意的是预期结果是从函数说明中导出,不能根据程序结构中导出。
为什么这么说?
让我们看程序中的第3行。
inti_temp=1;假如开发人员一不小心写错了,变成了inti_temp=0;根据程序导出的预期结果就会是一个错误的值,但是单元测试不出来问题。
那单元测试就失去了意义。
有人也许会问这么简单的函数就有4个测试用例,如果还复杂一些的怎么办?上面的测试用例还可以简化吗?答案是可以。
我们来看路径1B(4,24)和4C,D,G,I,A,B(4,6,13,19,22,4,24),路径1是路径4的真子集,所以1是可以不必要的。上图的圈复杂度是4。这个结果对我们来说有什么意义呢?它表示我们只要最多4个测试用例就可以达到基本路径覆盖。所以说圈复杂度标示是最多的测试用例个数,不是一定要4个测试用例才可以。不过有一点要申明的是测试用例越简化代表你的测试越少,这样程序的安全性就越低了。
四、完成测试
接下来根据测试用例使用工具测试NUNIT,VS2005都可以。
接下来根据测试结果编写测试报告,测试人,时间,结果,用例,是否通过,格式网上一大把,每个公司的格式也不一样就不说了。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/148660.html原文链接:https://javaforall.cn
边栏推荐
- Educational Codeforces Round 119 (Rated for Div. 2)
- What if the wireless network connection of the laptop is unavailable
- Internal learning
- Question 49: how to quickly determine the impact of IO latency on MySQL performance
- Clion console output Chinese garbled code
- How to re enable local connection when the network of laptop is disabled
- How to play dapr without kubernetes?
- How can we make a monthly income of more than 10000? We media people with low income come and have a look
- C语言-入门-基础-语法-[标识符,关键字,分号,空格,注释,输入和输出](三)
- Flutter integrated amap_ flutter_ location
猜你喜欢

微服務入門:Gateway網關

From scratch, use Jenkins to build and publish pipeline pipeline project

ctfshow web255 web 256 web257

Live in a dream, only do things you don't say
![[C Advanced] file operation (2)](/img/50/e3f09d7025c14ee6c633732aa73cbf.jpg)
[C Advanced] file operation (2)

地平线 旭日X3 PI (一)首次开机细节

【无标题】转发最小二乘法

ArcGIS应用(二十二)Arcmap加载激光雷达las格式数据
](/img/3f/4d8f4c77d9fde5dd3f53ef890ecfa8.png)
C语言-入门-基础-语法-[运算符,类型转换](六)

Newh3c - network address translation (NAT)
随机推荐
Research and investment strategy report of China's electronic hydrogen peroxide industry (2022 Edition)
Awk from getting started to digging in (4) user defined variables
awk从入门到入土(11)awk getline函数详解
Implementation principle of redis string and sorted set
微服務入門:Gateway網關
Démarrage des microservices: passerelle
[error record] no matching function for call to 'cacheflush' cacheflush();)
没有Kubernetes怎么玩Dapr?
Use Alibaba cloud NPM image acceleration
【无标题】转发最小二乘法
OpenFeign 服务接口调用
[BSP video tutorial] stm32h7 video tutorial phase 5: MDK topic, system introduction to MDK debugging, AC5, AC6 compilers, RTE development environment and the role of various configuration items (2022-
[C Advanced] file operation (2)
Awk from getting started to digging in (9) circular statement
Codeforces Round #803 (Div. 2)(A-D)
awk从入门到入土(7)条件语句
The upper layer route cannot Ping the lower layer route
There are 100 people eating 100 apples, one adult eating 4 apples, and four children eating 1 apple. How can they eat exactly 100 apples? Use any high-level language you are familiar with
How to play dapr without kubernetes?
Bishi blog (13) -- oral arithmetic test app