如何编写单元测试用例

如何编写单元测试用例 一、单元测试的概念  单元通俗的说就是指一个实现简单功能的函数。单元测试就是只用一组特定的输入(测试用例)测试函数是否功能正常,并且返回了正确的输出。  测试的覆盖种类  1.语句覆盖:语句覆盖就是设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次。  2.判定覆盖(也叫分支覆盖):设计若干个测试用例,运行所测程序,使程序中每个判断的取真分支和取假分支至少执行一次。  3.条件…

大家好,又见面了,我是你们的朋友全栈君。

 一、单元测试的概念
  单元通俗的说就是指一个实现简单功能的函数。单元测试就是只用一组特定的输入(
测试用例)测试函数是否功能正常,并且返回了正确的输出。
  测试的覆盖种类
  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.net/148660.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • js中alert的用法_asp中验证控件怎么使用

    js中alert的用法_asp中验证控件怎么使用ASP.NET验证控件与Attributes.Add脚本并存现在在ASP.NET中,我们也要实现这样的方式就不那么简单了,因为页面验证我们可以采用ASP.NET中的validator控件,同时只要把button的causeValidator设为true就可以了

    2022年9月26日
  • java.lang.RuntimeException: Can not toast on a thread that has not called Looper.prepare()终极解决方案

    java.lang.RuntimeException: Can not toast on a thread that has not called Looper.prepare()终极解决方案使用runOnUiThread方法,不使用Looper。

    2022年7月18日
  • 学习zencart模板制作[通俗易懂]

    学习zencart模板制作[通俗易懂]

         
        1,在includes/template下面新建个文件夹叫你新
    模板的名字就可以了(名字可以随便给只要你自己知道就
    可以了)这里我就叫yourname
        2,把includes/template/defalut_template
           这个文件夹下面的所有的文件夹和文件复制到你
    刚刚新建的文件夹里面去yourname
        3,把template_info.p

    2022年7月27日
  • python构造方法的作用_python中类的作用

    python构造方法的作用_python中类的作用1.构造函数的作用构造函数主要用来在创建对象时完成对对象属性的一些初始化等操作,当创建对象时,对象会自动调用它的构造函数。一般来说,构造函数有以下三个方面的作用:■给创建的对象建立一个标识符;■为对象数据成员开辟内存空间;■完成对象数据成员的初始化。2.默认构造函数当用户没有显式的去定义构造函数时,编译器会为类生成一个默认的构造函数,称为”默认构造函数”,默认构造函数不能完成…

    2022年9月8日
  • 前端实现异步的几种方式_redux是什么

    前端实现异步的几种方式_redux是什么1.什么是Saga?实际上,这个术语出自康奈尔大学的一篇论文:http://www.cs.cornell.edu/andru/cs711/2002fa/reading/sagas.pdf最初这篇论文是为了解决分布式系统中的LLT(LongLivedTransaction),也就是长时运行事务的数据一致性问题的。这么说有点抽象,我们来举个具体的例子:假如你在一个在线订票系统上订了一张…

    2022年9月18日
  • shiro面试必问_面试过程中的问题与对策

    shiro面试必问_面试过程中的问题与对策一,什么是Shiro?Shiro是apache旗下一个开源安全框架,它将软件的安全认证相关的功能抽取出来,实现用户身份授权,加密,会话管理等功能,组成了一个通用的安全认证框架二,目前市场主流的安全框架有哪些?(1),shiro:轻量级的,使用方便,灵活,是apache旗下一个开源安全框架,适合任何框架(2),SpringSeurity:是spring家族的一部分很多项目会使用到Spring全家桶,相对shiro来说SpringSeurity更轻量,必须要求spring环境,相对shiro

    2022年10月10日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号