• 12
  • 12
分享
  • 软件测试中如何编写单元测试用例(白盒测试)——软件测试圈
  • 饭团🍙 2021-12-21 14:11:34 字数 4167 阅读 2277 收藏 12

测试用例(Test Case)是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。 

测试用例(Test Case)目前没有经典的定义。比较通常的说法是:指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,并形成文档。 

不同类别的软件,测试用例是不同的。不同于诸如系统、工具、控制、游戏软件,管理软件的用户需求更加不统一,变化更大、更快。笔者主要从事企业管理软件的测试。因此我们的做法是把测试数据和测试脚本从测试用例中划分出来。测试用例更趋于是针对软件产品的功能、业务规则和业务处理所设计的测试方案。对软件的每个特定功能或运行操作路径的测试构成了一个个测试用例。 

随着中国软件业的日益壮大和逐步走向成熟,软件测试也在不断发展。从最初的由软件编程人员兼职测试到软件公司组建独立专职测试部门。测试工作也从简单测试演变为包括:编制测试计划、编写测试用例、准备测试数据、编写测试脚本、实施测试、测试评估等多项内容的正规测试。测试方式则由单纯手工测试发展为手工、自动兼之,并有向第三方专业测试公司发展的趋势。 

要使最终用户对软件感到满意,最有力的举措就是对最终用户的期望加以明确阐述,以便对这些期望进行核实并确认其有效性。测试用例反映了要核实的需求。然而,核实这些需求可能通过不同的方式并由不同的测试员来实施。例如,执行软件以便验证它的功能和性能,这项操作可能由某个测试员采用自动测试技术来实现;计算机系统的关机步骤可通过手工测试和观察来完成;不过,市场占有率和销售数据(以及产品需求),只能通过评测产品和竞争销售数据来完成。 

既然可能无法(或不必负责)核实所有的需求,那么是否能为测试挑选最适合或最关键的需求则关系到项目的成败。选中要核实的需求将是对成本、风险和对该需求进行核实的必要性这三者权衡考虑的结果。 

确定测试用例之所以很重要,原因有以下几方面。 

测试用例构成了设计和制定测试过程的基础。 测试的“深度”与测试用例的数量成比例。由于每个测试用例反映不同的场景、条件或经由产品的事件流,因而,随着测试用例数量的增加,您对产品质量和测试流程也就越有信心。 判断测试是否完全的一个主要评测方法是基于需求的覆盖,而这又是以确定、实施和/或执行的测试用例的数量为依据的。类似下面这样的说明:“95 % 的关键测试用例已得以执行和验证”,远比“我们已完成 95 % 的测试”更有意义。 测试工作量与测试用例的数量成比例。根据全面且细化的测试用例,可以更准确地估计测试周期各连续阶段的时间安排。 测试设计和开发的类型以及所需的资源主要都受控于测试用例。 测试用例通常根据它们所关联关系的测试类型或测试需求来分类,而且将随类型和需求进行相应地改变。最佳方案是为每个测试需求至少编制两个测试用例: 

  • 一个测试用例用于证明该需求已经满足,通常称作正面测试用例; ·另一个测试用例反映某个无法接受、反常或意外的条件或数据,用于论证只有在所需条件下才能够满足该需求,这个测试用例称作负面测试用例。

前段时间公司进行有关测试的培训,集成测试,性能测试,压力测试说了很多。由于本人还处于Coder阶段,只是对单元测试有了些了解。写下来怕以后自己忘记了。都是些自己的看法,不一定准确,欢迎高手指教。 

一、 单元测试的概念

单元通俗的说就是指一个实现简单功能的函数。单元测试就是只用一组特定的输入(测试用例)测试函数是否功能正常,并且返回了正确的输出。

测试的覆盖种类

  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;

代码:

int Test(int i_count, int i_flag)
{
int i_temp = 0;
while (i_count>0)
{
if (0 == i_flag)
{
i_temp = i_count + 100;
break;
}
else
{
if (1 == i_flag)
{
i_temp = i_temp + 10;
}
else
{
i_temp = i_temp + 20;
}
}
i_count--;
}
return i_temp;
}

1.画出程序控制流程图

图例:

图片1.png

事例程序流程图:

2.png

圈中的数字代表的是语句的行号,也许有人问为什么选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_flag=0,或者是i_flag<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=0;假如开发人员一不小心写错了,变成了int i_temp=1;根据程序导出的预期结果就会是一个错误的值,但是单元测试不出来问题。

那单元测试就失去了意义。

有人也许会问这么简单的函数就有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.嵌入式软件自动化测试平台分析嵌入式软件的自动化测试即利用脚本来自动化驱动嵌入式软件的运行,并且自动收集相关数据进行分析,最终生成相应的测试报告.虽然,嵌入式软件的自动化测试流程与一般PC机应用软件的自动化测试流程相同。但是,由于嵌入式软...
            0 0 3019
            分享
          •   第一,凭证测试用例的方式评估其品质,主要搜罗:  1)测试用例与需要规格剖析中需要条款的可追溯性,好比:咱们要求每一个需要条款至少有1个测试用例与之对于应。目的是为了评估测试的需要拆穿困绕率,以及合成需要爆发变更的时候,对于测试更正使命的影响水平。  2)测试用例有无清晰的期望服从。个别来说,测试用例的每一个实施步骤,都理当清晰形貌期望的服从,以保障测试职员可能与测试实际服从妨碍比力,并合成是否需要提交缺陷陈说,概况更正测试用例。  3)是否知足公司外部界说的测试用例模板。好比:每一个公司都可能界说了测试用例模板,好比界说了“测试规范”,要求每一个测试用例以及测试规范妨碍分割关联,并要求每...
            0 0 811
            分享
          • 前言综合测试整合测试非常复杂,需要一些开发和逻辑技能。的确如此!那么把这个测试整合到我们的测试策略中的目的是什么呢?这个问题我们先不着急回答,让我们一步步往下看你就知道了。为什么要进行集成测试?以下是一些原因:1、实际上,当开发一个应用程序时,它被分成更小的模块,并将其分配给每个开发者一个模块。一名开发者实现的逻辑与其他开发者完全不同,因此有必要检查开发人员实现的逻辑是否符合预期,并按规定的标准提供正确的值。2、大多数情况下,当数据从一个模块移动到另一个模块时,数据的表面或结构会发生变化。添加或删除某些值会导致后续模块出现问题。3、该模块还与某些第三方工具或应用编程接口互动,这些工具或应用编程...
            0 0 1284
            分享
          •   一、功能测试  1、点击提现按钮是否可以进入到提现界面;  2、未登录的情况下是否可以点击提现;  3、token失效或者登录态失效的情况下点击提现是否会跳到登录界面进行登录再提现;  4、假设提现的额度最低为0.01,最高为50000元,我需要通过边界值测试;  5、0.01能不能提现,100能不能提现,50000能不能提现,0.009能不能提现,50000.001能不能提现;  6、带小数点或者浮点型的能不能提现;  7、如果约束为小数点后2位、我用100.01能不能提现、我用100.009能不能提现成功;  8、是否有提现笔数的限制,比如一天只能提现10次,我要测试,提现10次,11...
            0 0 2384
            分享
          • 1.你是如何看待帮助别人工作?答:经过领导同意,在不影响自己的本职工作的前提条件下,我很支持同事之间的互帮互助。2.测试流程你们公司是怎么开展的答:我们公司是需求评审—编写测试用例—用例评审—执行测试(冒烟测试—系统测试—回归测试)—测试报告—上线3.项目上线的原则答:测试用例全部执行完成需求全部覆盖BUG单全部关闭4.版本谁来发布?答:开发发布版本5.测试工程师平时的工作答:参与需求评审编写测试用例测试用例评审执行测试用例提交bug,跟踪bug提交测试日报提交测试报告过程的评价软件本身的评价6.测试报告发给谁,内容?答:发给项目相关人员,开发,产品,UI,同组测试人员内容:测试范围,准出标准...
            0 0 1922
            分享
      • 51testing软件测试圈微信