|
2#
楼主 |
发表于 2017-6-1 16:40:39
|
只看该作者
根据这段代码的功能,用判定表的方法:
设计如下用例:
图3 三角形问题测试用例
若图3中的用例实施后,没有发现什么问题,那么从某种程度上,我们可以相信被测试的代码是可以值得信赖的。这是,我们再针对一个一个的方法进行白盒用例设计。
例如以下的代码段:
private boolean IsTriangle(){ //根据三角形三边的性质,判断a、b、c是否能组成一个三角形
boolean flagTriangle=true;
if(c1()&c2()&c3()){
if(a<b+c&b<a+c &c<a+b)
flagTriangle=true;
}
else{
flagTriangle=false;
}
}
else{
flagTriangle=false;
}
return flagTriangle;
}
根据条件覆盖的思想进行用例设计:
条件覆盖:
判定1中:c1()&c2()&c3()
c1:201 3
c2:-3 4
c3:0 5
①3,4,5
②201,-3,0
判定2中:a<b+c & b<a+c & c<a+b
a<b+c b<a+c c<a+b
①3,4,5
②7,3,4
③8,3,4
④3,7,4
⑤3,8,4
⑥3,4,7
⑦3,4,8
当然,你会发现白盒方式设计的用例,有些已经被黑盒方式的用例覆盖了,但不能说白盒用例设计就是没有价值的。这两种方式设计的用例,一综合起来,就能成了测试用例集合,这个集合中的用例,既能在功能上保证软件质量,也能从代码的结构上保证我们都测试到了。
总的来说,不管是什么测试,功能测试还是优先级最高的。最先要搞清楚这一段代码的功能是什么,它要做什么,传什么参数进去,实施了一番动作后,返回什么出来;从这个角度去设计用例,你可以用总所周知的等价类、边界值、判定表、正交……这类用例设计方法。然后运行这些测试,确定功能没有大问题了,再辅助以白盒测试用例设计,比如逻辑覆盖分析法设计用例。
三、 单元测试实施
具体到了实施的部分,就和测试的平台、框架以及编写代码的语言相关了。大家的提问我看到了,很多都是关于单元测试的实施部分的。有问关于平台的单元测试,例如Android;也有问关于某种语言的单元测试,例如C、python;也有问关于单元测试框架的问题,例如Scala Test。
我想针对这类问题先划分一下类别,不一定非常严谨:
单元测试在各个平台上都有可能会需要开展:例如常见的Win/Linux、OS X、Phone/Mobile、Android、嵌入式
要进行单元测试的应用使用不同的语言:C/C++、C#、Java、JavaScript、JSP、ASP、PHP……
各种语言上的单元测试工具也很多,针对C/C++有大家耳熟能详的CUnit和CPPTest,针对C#的有NUnit、java的话有Junit、TestNG、针对Javascript很多了,有JSUnit、YUI Test、Venus、Jest、jsUnity……
这么多种平台、语言、测试框架,还有一堆测试框架上的框架,比如Junit上的框架EasyMock、Zohhak框架(是一个参数化的 JUnit 测试框架),那就更加数不过来了。
我想可能是"单元测试"这个话题有点大,有点类似"编程语言"这种话题一样,范围比较广。所以要是想谈哪个单元测试工具好,估计会跟论坛中的人讨论哪种编程语言最好,产生一样的效果。
所以我想回答各位的是,实施单元测试,我们要考虑的问题有:
· 将来要写的测试代码在那种平台上运行
· 我所测试的代码是哪种语言,我对语言本身是否熟悉
· 我使用的测试框架是否和被测试的应用是低耦合的
· 我最擅长最熟悉的测试框架是哪个?
· 被测试的应用和我写的测试代码,是如何协同合作,两者之间如何保持了一定的独立性,这里的意思是生产代码(被测试的代码)和消费代码(你写的测试代码)要分开。
· 单元测试经常会要考虑解除代码之间的依赖关系,那我们就要考虑代码之间原本的依赖是哪些。比如有人问"单元测试的时候测试的模块有调用外部的函数,调用函数假设为f(a,b),a,b是指针的话,我怎么测这个函数呀。写桩函数时指针是随机分配的",其实这时候,就可以对被调用的函数写个mock。
例如:
" 我们需要对运行在容器中的Servlet组件进行单元测试,那得需要一个容器吧?
" 我们要对数据库进行操作,那得需要准备好数据库吧?
" 我们在嵌入式平台上进行测试,那测试的代码在被嵌入的平台上能否运行?若是没法直接在硬件平台上得到反映,那的看看是否有一种替换的方案(仿真)
" 我们可能在代码中引用了另一个团队的代码,可是另一个团队的代码还未及时发来,但我们又不能耽搁测试
若是要解除依赖,会用哪个框架呢?可有API的说明?
确定被测试的应用必须写单元测试吗?例如和数据库之间的交互,若是数据准备起来并不麻烦,且数据可以反复使用,没有那种运行一次就要把数据重新生成一次的麻烦,那我们为何不能用"Jmeter测试JDBC请求"这种方式进行测试呢?
不管你是哪个平台、哪种语言、哪个测试工具,我想上面的问题都是在进行单元测试之前要先回答的。望各位在考虑单元测试的时候,不要仅仅着眼在哪个语言,哪个工具。
四、 自动化持续集成
之前讲过的测试设计和实施,都是自己在单打独斗的进行测试要做的。但是单元测试为何总是在企业总不如系统测试那么普及和深入人心呢,原因有很多,但我想,诸多原因之一,可能也包括缺乏一个放大家共同进行单元测试的协作平台。
单元测试要在团队中普及和实现,我认为有以下4个要素:
· 配置管理工具:对被测试的代码进行版本管理,以便单元测试的时候,可以知道被测试的代码在哪里获取。比如SVN/Git。
· 构建平台:对被测试的代码、测试代码要进行编译,运行测试,这些事我们用一个工具完成,不要手动的点,这样的工具,就成为构建平台。比如Ant和Maven。
· 测试框架:最好不要用main作为测试的入口,比如使用JUnit。JUnit 的优点是整个测试过程无人值守,开发无须在线参与和判断最终结果是否正确,可以很容易地一次性运行多个测试,使得开发更加关注测试逻辑的编写,而不是增加构建维护时间。
推荐阅读:http://junit.sourceforge.net/javadoc/
· 反馈平台:把以上的三个要素组合起来,运行完测试,得到一个比较好理解的测试报告。比如Jenkins&Sonar。其中Jenkins能持续、自动地构建测试软件项目、监控一些定时执行的任务;而Sonar提供的测试报告是非常让人惊喜的,包括:单元测试覆盖率、成功率、代码注释、代码复杂度等度量数据。
推荐阅读:https://jenkins.io/doc/
五、 结束语
从大家的问题中看,主要是关于单元测试的工具和如何开展。
1、工具的选择,让大家产生了一种选择综合症的感觉,其实我看测试工具用什么,还是看被测试应用的平台、语言、环境。至于测试工具,个人感受的话,尽量用市面上见得多的,起码有啥问题找得到地方问。
2、单元测试如何开展这个问题,我想:
一来是单元测试的计划、方案、用例、执行这一类的问题;
二来应该是各位很想了解某种平台某种语言下的某个测试框架要怎么用;
三来是自动化持续构建怎么实施。
对1、和2、的问题,由于篇幅和时间有限,我只能浅谈到此。 |
|