如何设计单元测试用例

菜花小兔 菜花小兔     2022-09-16     226

关键词:


一、 单元测试的概念

        单元通俗的说就是指一个实现简单功能的函数。单元测试就是只用一组特定的输入(测试用例)测试函数是否功能正常,并且返回了正确的输出。
        测试的覆盖种类
        1.语句覆盖:语句覆盖就是设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次。
        2.判定覆盖(也叫分支覆盖):设计若干个测试用例,运行所测程序,使程序中每个判断的取真分支和取假分支至少执行一次。
        3.条件覆盖:设计足够的测试用例,运行所测程序,使程序中每个判断的每个条件的每个可能取值至少执行一次。
        4.判定——条件覆盖:设计足够的测试用例,运行所测程序,使程序中每个判断的每个条件的每个可能取值至少执行一次,并且每个可能的判断结果也至少执行一次。
        5.条件组合测试:设计足够的测试用例,运行所测程序,使程序中每个判断的所有条件取值组合至少执行一次。
        6.路径测试:设计足够的测试用例,运行所测程序,要覆盖程序中所有可能的路径。
        用例的设计方案主要的有下面几种:条件测试,基本路径测试,循环测试。通过上面的方法可以实现测试用例对程序的逻辑覆盖,和路径覆盖。

二、开始测试前的准备
        
        在开始测试时,要先声明一下,无论你设计多少测试用例,无论你的测试方案多么完美,都不可能完全100%的发现所有BUG,我们所需要做的是用最少的资源,做最多测试检查,寻找一个平衡点保证程序的正确性。穷举测试是不可能的。   所以现在进行单元测试我选用的是现在一般用的比较多的基本路径测试法。

三、开始测试

       基本路径测试法:设计出的测试用例要保证每一个基本独立路径至少要执行一次。

        函数说明 :当i_flag=0;返回     i_count+100
                                当i_flag=1;返回   i_count  *10
                                否则  返回   i_count  *20


        输入参数:int i_count ,  
                            int i_flag
        输出参数: int  i_return; 
        
       
        代码:
         

 1  int Test(int i_count, int i_flag)
 2         {
 3             int i_temp = 1;
 4             while (i_count>0)
 5             {
 6                 if (0 == i_flag)
 7                 {
 8                     i_temp = i_count + 100;
 9                     break;
10                 }
11                 else
12                 {
13                     if (1 == i_flag)
14                     {
15                         i_temp = i_temp * 10;
16                     }
17                     else
18                     {
19                         i_temp = i_temp * 20;
20                     }
21                 }
22                 i_count--;
23             }
24             return i_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有几条路径呢?
             1 B(4,24)
             2 C,E,J(4,6,8,24)
             3 C,D,F,H,A,B(4,6,13,15,22,4,24)
             4 C,D,G,I,A,B(4,6,13,19,22,4,24)
             还有吗??
             5 C,D,C,I,A,C,E,J(4,6,13,19,22,4,6,8,24)算吗?
            不算,为什么?因为上面的4条路径已经包括了所有的边。第5条路径已经不包含没有用过的边了。所有的路径都遍历过了。
            好了,现在我们有了4条基本独立路径根据独立路径我们可以设计测试用例。

            1 B(4,24)
            输入数据:i_count=0,或者是i_count<0的某一个值。
            预期结果:i_temp=0.

             2 C,E,J(4,6,8,24)
            输入数据: i_count =1;i_flag=0 
            预期结果:i_temp=101.

             3 C,D,F,H,A,B(4,6,13,15,22,4,24)
            输入数据: i_count =1;i_flag=1 
            预期结果:i_temp=10.


             4 C,D,G,I,A,B(4,6,13,19,22,4,24)
             输入数据: i_count =1;i_flag=2     
             预期结果:i_temp=20.
            
            这里的输入数据是由路径和程序推论出来的。而要注意的是预期结果是从函数说明中导出,不能根据程序结构中导出。
            
            为什么这么说?
            让我们看程序中的第3行。
            int i_temp=1;假如开发人员一不小心写错了,变成了int i_temp=0;根据程序导出的预期结果就会是一个错误的值,但是单元测试不出来问题。
            那单元测试就失去了意义。

            有人也许会问这么简单的函数就有4个测试用例,如果还复杂一些的怎么办?上面的测试用例还可以简化吗?答案是可以。
            我们来看 路径    1 B(4,24)和   4 C,D,G,I,A,B(4,6,13,19,22,4,24),路径1是路径4的真子集,     所以1是可以不必要的。上图的圈复杂度是4。这个结果对我们来说有什么意义呢?它表示我们只要最多4个测试用例就可以达到基本路径覆盖。所以说圈复杂度标示是最多的测试用例个数,不是一定要4个测试用例才可以。不过有一点要申明的是测试用例越简化代表你的测试越少,这样程序的安全性就越低了。

四、完成测试
            
            接下来根据测试用例使用工具测试NUNIT,VS2005都可以。
            接下来根据测试结果编写测试报告,测试人,时间,结果,用例,是否通过,格式网上一大把,每个公司的格式也不一样就不说了。

软件测试之如何编写单元测试用例

单元测试是以程序设计说明书为指导,测试模块范围内的重要控制路径,以揭露错误。当程序编好以后,将它录制在媒体上,或者直接由终端键盘输入到机中进行调试。测试的相对复杂性和所发现的错误受到单元测试所限定的范... 查看详情

单元测试中测试用例的设计方法

单元测试中测试用例的设计方法1.用于语句覆盖的基路径法基路径法保证设计出的测试用例,使程序的每一个可执行语句至少执行一次,即实现语句覆盖。基路径法是理论与应用脱节的典型,基本上没有应用价值,读者稍作了解... 查看详情

软件测试的分类&测试用例的设计&如何编写测试用例

参考技术A常见的开发模型:V模型、瀑布模型、敏捷开发模型、W模型软件生命周期:1、问题的定义及规划2、需求分析3、软件设计(明确怎么做!)4、软件编码5、软件测试6、运行维护测试生命周期:单元测试:一般是开发完成... 查看详情

编写单元测试用例说明书的依据是啥

...正确的输出。测试的覆盖种类1.语句覆盖:语句覆盖就是设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次。2.判定覆盖(也叫分支覆盖):设计若干个测试用例,运行所测程序,使程序中每个判断的... 查看详情

如何使用闭包创建单元测试用例

】如何使用闭包创建单元测试用例【英文标题】:Howtocreateunittestcaseswithclosures【发布时间】:2020-07-2912:31:52【问题描述】:我已经在我的应用程序中创建了单元测试用例,到目前为止还不错。我在我的项目中使用MVVM并且我的API... 查看详情

如何在 jasmine 中编写单元测试用例?

】如何在jasmine中编写单元测试用例?【英文标题】:Howtowriteunittestcaseinjasmine?【发布时间】:2021-07-1110:27:36【问题描述】:Flag(a)letelement=this.selected.filter(item=>item.a===a)returnelement.length>1?true:false;不确定如何为上述函数编写单元... 查看详情

如何使用 Jasmine 为以下 javascript 函数编写单元测试用例

】如何使用Jasmine为以下javascript函数编写单元测试用例【英文标题】:HowtowriteUnitTestCaseforbelowjavascriptfunctionusingJasmine【发布时间】:2019-04-1303:24:37【问题描述】:如何使用Jasmine为下面的javascript函数编写单元测试用例?functionGetURL... 查看详情

如何在 iOS swift 中制作登录屏幕的单元测试用例

】如何在iOSswift中制作登录屏幕的单元测试用例【英文标题】:HowcanimakeunittestcasesofLoginscreeniniOSswift【发布时间】:2019-05-0209:33:16【问题描述】:我在登录屏幕上遇到问题。如何使用登录屏幕制作单元测试用例?我有一个带有操... 查看详情

如何在订阅Angular7单元测试用例中对代码进行单元测试

】如何在订阅Angular7单元测试用例中对代码进行单元测试【英文标题】:HowtounittestcodeinsidesubscribeforAngular7unittestcase【发布时间】:2019-09-1411:10:24【问题描述】:我想对所有代码进行单元测试并获得覆盖率,但我无法获得订阅内存... 查看详情

如何利用分层测试概念设计针对性测试用例

一除了纯后台测试或者纯接口测试外,我想大部分人都会接触业务测试,至少我们目前的客户端产品测试就是这样。之前和我们组客户端测试同学沟通,总是会发现大家用例的关注点大部分都集中在业务逻辑的覆盖上,对具体逻... 查看详情

白盒测试用例设计方法笔记-白盒测试用例设计概述

...用例设计方法,需要清楚盒子内部的东西以及里面是如何运作的。简单说和黑盒测试的区别在于需要了解程序内部的逻辑和结构。2白盒用例设计方法基于控制流的测试;①基本路径测试;②分支-条件测试;③循... 查看详情

按照right-bicep要求设计四则运算3程序的单元测试用例

按照Right-BICEP要求:Right——结果是否正确?B——是否所有的边界条件都是正确的?I——能查一下反响关联吗?C——能用其它手段交叉检查一下吗?E——你是否可以强制错误条件发生?P——是... 查看详情

质量如何衡量测试用例质量

测试用例的标准不能局限于一个层次,因为测试用例设计类似于软件设计,软件设计有架构设计(结构设计/概要设计)和详细设计,所以对于测试用例的质量标准,也应分为两个层次来考虑:高层次——满足某... 查看详情

质量如何衡量测试用例质量

测试用例的标准不能局限于一个层次,因为测试用例设计类似于软件设计,软件设计有架构设计(结构设计/概要设计)和详细设计,所以对于测试用例的质量标准,也应分为两个层次来考虑:高层次——满足某... 查看详情

质量如何衡量测试用例质量

测试用例的标准不能局限于一个层次,因为测试用例设计类似于软件设计,软件设计有架构设计(结构设计/概要设计)和详细设计,所以对于测试用例的质量标准,也应分为两个层次来考虑:高层次——满足某... 查看详情

如何使用 Kafka Streams 为应用程序编写单元测试用例

】如何使用KafkaStreams为应用程序编写单元测试用例【英文标题】:HowtowriteunittestcaseforapplicationusingKafkaStreams【发布时间】:2021-08-2114:52:06【问题描述】:我们正在构建一个将使用KafkaStreams的应用程序。我们正在寻找示例示例,该... 查看详情

在敏捷测试中如何设计用例

1.测试用例的粒度测试用例可以写得很简单,也可以写得很复杂。最简单的测试用例是测试的纲要,仅仅指出要测试的内容,如探索性测试(ExploratoryTesting)中的测试设计,仅会指出需要测试产品的哪些要素、需要达到的质量目... 查看详情

软件测试培训第27天

...出。  测试的覆盖种类  1.语句覆盖:语句覆盖就是设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次。  2.判定覆盖(也叫分支覆盖):设计若干个测试用例,运行所测程序,使程序中每个判... 查看详情