C语言白盒测试例_第1页
C语言白盒测试例_第2页
C语言白盒测试例_第3页
C语言白盒测试例_第4页
C语言白盒测试例_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言白盒测试实例文档管理信息表主题C语言白盒测试实例版本TIBCO SDETest Vl. 0内容设计关键字白盒参考文档单元测试创建时间2008-04-11创建人冯昌建职位SDETest 主管最新发布日期2008-04-151/1白盒测试实例之一一需求说明三角形的问题在很多软件测试的书籍中都岀现过,问题虽小,五脏俱全,是个很不错的 软件测试的教学例子。本文借助这个例子结合教学经验,从更高的视角来探讨需求分析、软 件设计、软件开发与软件测试之间的关系与作用。题目:根据下而给出的三角形的需求完成程序并完成测试:一、输入条件:1、条件1:a+bc2、条件2:a+cb3、条件3:b+ca4、条件4:

2、0a2005、条件5:0b2006、条件6:0c2007、条件7:a=b8、条件8:a=c9、条件9:b=c10、条件 10: a2+b2=c211、条件 11: a2+ c2= b212、条件 12: c2+b2=a2二、输出结果:1、不能组成三角形2、等边三角形3、等腰三角形4、直角三角形5、一般三角形6、某些边不满足限制白盒测试实例之二答案很多初学者一看到这个需求(详见白盒测试实例之一需求说明收藏),都觉得很简 单,然后立刻就开始动手写代码了,这并不是一个很好的习惯。如果你的第一直觉也是这样 的,不妨耐心看到文章的最后。大部分人的思路:1、首先建立一个main函数,main函数第一件事是

3、提示用户输入三角形的三边, 然后获取用户的输入(假设用户的输入都是整数的情况),用C语言来写,这一步基本上 不是问题(printf和scanf),但是要求用java来写的话,很多学生就马上遇到问题了,java5.0 及之前的版本不容易获取用户的输入。点评:这样的思路做出来的程序只能通过手工方式来测试所有业务逻辑,而且这个 程序只能是DOS界面版本了,要是想使用图形化界而来做输入,就得全部写过代码。2、业务处理流程的思路用流程图表示如下:3、C语言代码: #include void main()int a, b, c;printf(Hplease enter three integer:); s

4、canf(,%d%d%d,/ &a, &b, &c);if(Oa & a200 & Ovb & b200 & Ovc & cc & a+cb & c+ba) if(a=b & b=c & a = =c) 这里可以省掉个判断printf(nl是等边三角形J;elseif(a=b 11 b=c 11 a=c)printf(H2是等腰三角形J;elseif(a*a+b*b=c*c 11 a*a+c*c=b*b 11 b*b+c*c=a*a) printf(n3是直角三角形J;elseprintf(H4是-般三角形J;elseprintf(H5不能组成三角形J;elseprintf(n6某些边不满足限

5、制”);点评:这样的思路做出来的程序只能通过手工方式来测试所有业务逻辑,而且这个程序 只能是DOS界而版本了,要是想使用web或图形化界面来做输入,就得全部写过代码。相关阅读:白盒测试实例之一一需求说明收藏白盒测试技术方法与实践篇白盒测试技术白盒测试理论篇如何编写单元测试用例(白盒测试)白盒测试中的六种覆盖方法白盒测试实例之三一需求分析关键字:白盒测试、需求分析需求分析是后续工作的基石,如果分析思路有问题,后续工作可能就会疋向不正确 的方向,比如:代码重用性差、难于测试、难于扩展和难于维护等。反而,如果需求分析做 的好,对设讣、开发和测试来说,都可能是很大的帮助。看到题目给出的条件达12个之多

6、,粗粗一看,好像很复杂,但仔细分析之后,发 现可以把它们分成4组来讨论:1、条件 1: a+bc;条件 2: a+cb;条件 3: b+ca这三个表达式有什么特点呢?实际上它们的逻辑是一样的:两个数之和大于第三个 数。那么,前而程序的写法就存在逻辑重复的地方,应该把这个逻借提取到一个函数中。2、条件 4: 0a200:条件 5: 0b200:条件 6: 0c Triangle.h:Copyright (c) 2008,胡添发(hutianfa):三角形类型判断:finclude include/*判断-个整数是否在(0, 200)区间内*返回值:true-否;false-是*/bool isO

7、utOfRange(int i);/*判断三条边是否合法(即:判断三条边都在合法的范圉内)*返回值:true-是:false-否*/bool isLegal(int a, int b, int c);/*判断两条边之和是否大于第三边*返回值:true-是:false否*/bool isSumBiger(int az int bz int c);/*判断三条边是否能够组成三角形*返回值:true-是:false否*/bool isTriangle(int az int bz int c);*判断两条边是否相等*返回值:true-是:false-否*/bool isEquals(int a, in

8、t b);/*求三角形有几条边相等*返回值:相等边的数量*/int howManyEquals(int a, int b, int c);/*判断是否满足两边平方之和是否等于第三边的平方*/bool isPowerSumEquals(int a, int b, int c);/*判断第-个数是否比第二个数大*/bool isGreaterThan(int a, int b);/*判断是否是直角三角形*/bool isRightRriangle(int a, int bz int c);*判断三角形的类型,返回值:* 1、不能组成三角形* 2、等边三角形* 3、等腰三角形* 4、直角三角形* 5

9、、般三角形* 6、某些边不满足限制*/int triangleType(int a, int bz int c);白盒测试实例之六单元测试的步骤白盒测试与黑盒测试的过程和方法是有一些区别的。单元测试的步骤:1、理解需求和设计理解设计是很重要的,特别是要搞淸楚被测试模块在整个软件中所处的位置,这对 测试的内容将会有很大的影响。需要记住的一个原则就是:好的设计,并模块只负责完成自 己的事情,层次与分工是很明确的。在单元测试的时候,可以不用测试不属于被测试模块所 负责的功能,以减少测试用例的冗余,集成测试的时候会有机会测试到的。举例::判断三条边是否能够组成三角形:返回值:true-是;false-

10、否7ool isTriangle(int a, int b, int c);测试该函数的时候,只需要测试三条边(在合法的取值范国内的整数)是否能够满 足两边之和是否大于第三边的功能,而不需要测试三条边是否在合法的范用(0,200)之间的整数,因为调用该函数之前,一立要先通过下而函数的检査,要是检査不通过,就不会 执行isTriangle函数。:判断三条边是否合法(即:判断三条边都在合法的范围内):返回值:true-是:false-否7ool isLegal(int a, int b, int c);所以,单元测试主要是关注本单元的内部逻辑,而不用关注整个业务的逻辑,因为 会有别的模块去完成相关

11、的功能。白盒测试实例之七单元测试的尝试关键字:白盒测试单元测试软件测试以测试isOutOfRange函数为例,首先知道该函数在整个软件架构中处于最底层(叶 子),所以对它进行测试并不需要写桩模块,只需要写驱动模块。要注意的问题是:对于测 试结果是否通过测试不要使用printf方式打印被测试函数的返回结果值,否则就需要人工去 检查结果了。使用边界值的方法可以得到5个测试用例,写的驱动模块代码如下:tTrian gle.cpp::Copyright (c) 2008,胡添发(hutianfa):单元测试与集成测试7include Triangle.h*:测试isOutOfRange函数,使用边界值

12、的方法(0,1,5,199,200)*/void testIsOutOfRange_try()if(isOutOfRange(0) = true)printf(pass!n);elseprintf(fail!n);if(isOutOfRange(l) = false)printf(pass!n);elseprintf(fail!n);void main() testIsOutOfRange_try();小知识:做单元测试的时候,一般不直接在main函数中写所有的测试代码,否则 的话,main函数将会非常庞大。正确的做法:针对每个函数分別创建一个或若干个(函数 比较复杂时)测试函数,测试函数的名

13、称习惯以test 头。写到这里发现重复的代码太多了,而且如果测试用例数量很多的话,对于测试结果 的检查也将是很大的工作量。在测试有错误的时候,这样的单元测试结果也很难获得更多关 于错误的信息。解决问题的途径可以采用cppUnit单元测试框架。不过这里为了让学生能够对单元 测试和单元测试框架有进一步的理解,我决左自己写一个类似cppUnit的简单的测试框架。 相关阅读: 白盒测试实例之六单元测试的步骤 白盒测试实例之五编码 白盒测试实例之四程序设计 白盒测试实例之三一一需求分析 白盒测试实例之二答案 白盒测试实例之一一一需求说明 白盒测试实例之八构建自己的单元测试框架(上) 关键字:单元测试、白

14、盒测试在上一讲“单元测试的尝试“里我们遇到了几个问题:1、代码重复的问题太多2、测试结果需要人工去检查3、对测试的总体信息也无从得知本讲将构建一个简单的单元测试框架来解决以上的问题:1、代码重复的问题太多这个问题很容易解决,只需要把判断预期结果和实际结果的逻辑提取到某个函数中即可。从整个代码来看,有两种类型的结果的函数:(1) 返回布尔型(2) 返回整数因此,需要两个类型的判断预期结果和实际结果是否相符的函数:判断是否取值为真7oid assertTrue(char *msg, bool actual)F(actual)elseprintfCF);/*判断预期结果和实际结果是否相符*/void

15、 assertEquals(char *msgz int expect, int actual)if(expect = actual)printfelse printfCT);小知识:XUnit系列的框架的习惯使用assert*的命爼来泄义判断函数,对于通过的 测试习惯打印一个“一”号,而对于失败的测试习惯打印一个“F”。2、测试结果需要人工去检查对于测试结果不要使用printf方式打印被测试函数的返回结果值就可以避免这个问 题。3、对测试的总体信息也无从得知除了问题1的解决办法里使用“ ”表示测试通过和“F”表示测试失败可以提高对测试 结果的信息的直观性之外,做单元测试的人还希望能够得到以下

16、的信息:(1)执行的测试用例总数、通过的数量和失败的数量(2)测试执行的时间(3)如果测试用例执行失败了,希望知道是哪个测试用例失败,从而去分析失败 的原因。白盒测试实例之九构建自己的单元测试框架(下)完整的源代码如下:1、UnitTest.h* Copyright (c) 200& 胡添发*简单的单元测试框架*/?include;includestring h#include#include/* VC中没有sleep函数,自己写个* wait单位是亳秒*/extern void sleep(clock_t wait):*判断是否取值为真*/void assertTrue(char *msg,

17、 bool actual);/*判断预期结果和实际结果是否相符*/void assertEquals(char *msg, int expect, int actual);/*初始化测试,开始计时*/void init ();/*结束测试,结束计时,打印报告*/void end();白盒测试实例之十集成测试的概念测一、桩模块和驱动模块(以C语言为例):很多人对桩模块和驱动模块的概念会搞不淸楚,下面先介绍这两个槪念:模块结构实例图:假设现在项目组把任务分给了 7个人,每个人负责实现一个模块。你负责的是B 模块,你很优秀,第一个完成了编码工作,现在需要开展单元测试工作,先分析结构图:1、由于B模块

18、不是最顶层模块,所以它一泄不包含main函数(A模块包含main 函数),也就不能独立运行。2、B模块调用了 D模块和E模块,而目前D模块和E模块都还没有开发好,那 么想让B模块通过编译器的编译也是不可能的。那么怎样才能测试B模块呢?需要做:1、写两个模块Sd和Sc分别代替D模块和E模块(函数名、返回值、传递的参数 相同),这样B模块就可以通过编译了。Sd模块和Sc模块就是桩模块。2、写一个模块Da用来代替A模块,里而包含main函数,可以在main函数中调 用B模块,让B模块运行起来。Da模块就是驱动模块。知识点:桩模块的使命除了使得程序能够编译通过之外,还需要模拟返回被代替的模块的齐种可能返回值(什么时候返回什么值需要根据测试用例的情况来决定)。驱动模块的使命就是根据测试用例的设汁去调用被测试模块,并且判断彼测试模块的返回值是否与测试用例的预期结果相符。1/1二、集成测试策略:1.非增式集成测试各个单元模块经过单元测试之后,一次性组装成完整的系统。优点:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论