单元测试准则
C/C++怎么做好单元测试
最完整的自动化测试流程
软件测试用例自动生成技术研究 论文
单元测试是保证软件质量非常有效的手段,无论是从测试理论早期介入测试的理念来看或是从单元测试不受UI影响可以高速批量验证的特性,所以业界所倡导的测试驱动开发,这个里面提到的测试驱动更多的就是指单元测试驱动。但一般开发团队还是很少的系统化的执行单元测试,针对应用软件的测试更多是由专业测试团队来执行黑盒测试。单元测试的最大的难点不在于无法确定输入输出,这毕竟是模块开发阶段就已经定好的,而在于单元测试用例的编写会耗费开发人员大量的工时,按照相关统计单元测试用例的时间甚至会远超过功能本身开发的时间。
制约测试用例采用程序自动生成,最关键的底层技术是复杂的参数解析技术。即:能够在编译器层面对于任意复杂的类型,任意定义嵌套层级的递归解析。如果没有这个关键技术的突破,那么测试用例自动生成系统要么无法商用,要么将以极低的效率来演化、产生合规的测试数据。例如著名的模糊测试工具American Fuzzy Lop,它并不能够识别用户的程序所需要的结构类型,需要从最外层进行基于搜索算法的演化。程序的特性是接口层面的输入和内部某个模块的数据要求距离很远,外部数据通常是经过层层复杂转换才可以成为内部模块所需要的数据结构类型,因此从外层探索所需要的计算量和时间将是难以想象的。基于American Fuzzy Lop,为了能够生成一个合法的SQL 语句,让程序内部模块能够通过外围数据校验需要探索时间以天数计,远非分钟或者小时可以生成。另外一个制约性条件是:每个程序能够接手的输入都是经过精心结构编制、含有大量规则的数据,而这些数据通过随机+探索的方式生成是非常不现实和极其耗时的。所以,从黑盒以及最外层输入产生自动产生用例是不可行的。
如果从软件内部结构分析产生用例驱动,就需要对软件的编译结构进行深度理解。可行的测试用例生成系统,应该是基于程序的中间(关键入口)作为测试切入最为合适。这些模块的输入,已经将模糊的输入转化为高度结构化的参数。只要能够识别这些复杂结构,将复杂数据类型一步步降解为简单数据类型,同时完成参数构造,就可以自动完成驱动用例的生成。
基于模块的测试,可以划归为传统的单元测试,它是将缺陷发现并遏制在研发阶段最好的方法。但受限于单元测试需要开发大量的驱动程序,在行业内的推广和应用受到了极大的限制。当然单元测试也可以在系统集成完毕后执行,避免构建虚拟的桩程序。
1)简介
PC-Lint是一个历史悠久,功能异常强劲的静态代码检测工具。它的使用历史可以追溯到计算机编程的远古时代(30多年以前)。经过这么多年的发展,它 不但能够监测出许多语法逻辑上的隐患,而且也能够有效地帮你提出许多程序在空间利用、运行效率上的改进点,在很多专业级的软件公司,比如 Microsoft, PC-Lint检查无错误无警告是代码首先要过的第一关,对于小公司和个人开发而言,PC-Lint也非常重要,因为基于开发成本考虑,小公司和个人往往 不能拿出很多很全面的测试,这时候,PC-Lint的强劲功能可以很好地提高软件的质量.
2)功能特性
PC-Lint是一种静态代码检测工具,可以说,PC-LINT是一种更加严格的编译器,不仅可以象普通编译器那样检查出一般的语法错误,还可以检查出那些虽然完全合乎语法要求,但很可能是潜在的、不易发现的错误。
PC-lint不但可以检测单个文件,也可以从整个项目的角度来检测问题,因为C语言编译器固有的单个编译,这些问题在编译器环境下很难被检测,而PC-Lint在检查当前文件的同时还会检查所有与之相关的文件。
辑环境和编译器,比如PC-lint支持几乎所有流行的编Borland C++从1.x到5.x各个版本、Borland C++ Build、GCC、VC,VC.net、watcom C/C++、Sourceinsight、intel C/C++等等,也支持16/32/64的平台环境。
支持Scott Meyes的名著(Effective C++/More Effective C++)中说描述的各种提高效率和防止错误的方法。
1)简介
VcTester是与VC(注:Visual C++及Visual Studio开发套件是微软发布的产品)配套使用的新一代单元测试工具,分共享版与商用版两大系列,其主要功能包括:脚本化测试驱动(包括修改变量与调用 函数)、脚本桩、支持持续集成测试、测试覆盖率统计(仅商用版本)、生成测试报告(仅商用版本)、测试消息编辑器(仅商用版本)等。
2)功能特性
脚本化测试驱动
脚本桩
在线测试
即时调测
测试工程管理
http://www.cse-soft.org/VcTester/
1)简介
VU是新一代单元测试工具,功能强大,使用简单,完全可视化,不需编写测试代码。VU的测试结果使程序行为一目了然,有助于整理编程思路和提高编程效率和 正确性,并能快速排错;VU还增强调试器功能(如实现后退等功能),提高调试的效率;VU能达到空前的测试完整性,轻松实现语句覆盖、条件覆盖、分支覆 盖、路径覆盖;VU提供详尽的测试报告,VU不仅是单元测试工具,更是一种使程序开发变得更高质更高效更舒适的工具。
2)功能特性
自动生成测试代码
测试用例可视化编辑
程序行为一目了然
空前的测试完整性
高效设计白盒覆盖测试用例
快速排错,高效调试
http://www.unitware.cn
1)简介
C++Test是一个功能强大的自动化C/C++单元级测试工具,可以自动测试任何C/C++函数、类,自动生成测试用例、测试驱动函数或桩函数,在自动化的环境下极其容易快速的将单元级的测试覆盖率达到100%。
2)功能特性
即时测试类/函数
支持极端编程模式下的代码测试
自动建立类/函数的测试驱动程序和桩调用
自动建立和执行类/函数的测试用例
提供快速加入和执行说明和功能性测试的框架
执行自动回归测试
执行部件测试(COM)
http://www.parasoft.com
CuTest(Cute Test)是一个非常简单的C语言单元测试工具。在使用它的时候,只需要包含两个文件“CuTest.c CuTest.h”,然后就可以写测试用例,进行测试了。它对用例几乎没有管理功能,报表输出也非常简单,可以用来试验单元测试的基本想法。
CUnit是一个轻型的C语言单元测试框架。它提供了设计、管理、运行测试用例的功能。它的报表功能比较强大,但是比较麻烦,更适合于较大一些的项目。
Wings与parasoft c++ test在单元测试用例自动生成能力的比对
星云测试日前全球首发的Wings产品,是一个智能的、全自动的单元测试用例生成系统,研究并解决了如下难点。
(1) 程序参数深度分析问题
Wings通过编译器底层技术,将输入的源文件,按照函数为单位,形成模块对象。对象中包含函数的输入参数,返回值类型等信息,供驱动函数模块和测试用例模块使用。每个文件作为一个单元,针对其中的每个函数的每个参数进行深度解析,对于嵌套类型,复杂类型等都可以实现精确的解析和分解,将复杂类型逐层讲解为基础数据类型,并产生参数结构的描述文件(PSD)。
(2) 函数驱动自动生成模块
依据PSD文件的格式信息,自动生成被测源程序的所有驱动函数,单元测试过程不再依赖开发人员手动编写测试函数,只需将生成的驱动函数和被测源文件一起编译,即可执行测试并查看测试结果。测试驱动自动生成程序基于PSD描述,全自动构建驱动被测程序运行的所有参数,必须的全局变量,并可根据复杂变量的层级结构产生结构化的测试驱动程序,可以节省大量的单元测试用例的编写时间。
(3) 测试数据自动生成与管理
用于自动生成测试数据,测试数据与被测函数提取的信息相互对应,数据以一定的层次逻辑关系存储在json文件中。数据和经过分解和展开后的数据类型是一一对应的。这些数据用户可以根据业务要求随意边际,并且用json文件进行结构化,层次化展示,非常的清晰。其中的测试数据包括全局变量值、被测函数调用时的参数值。
被测程序信息提取----> 驱动程序(单元测试程序)的自动生成------> 测试数据自动生成 -----> 执行单元测试
依据的是多因素组合测试可以生成测试用例集,以覆盖任意N个因素的所有取值组合,在理论上可以发现由N个因素共同作用引发的缺陷。简单的理解就是每一个参数的每一个值只需要和其他参数至少配对一次就够了。
PICT工具就是在微软公司出品一款成对组合的命令行生成工具。PICT 可以有效地按照两两测试的原理,进行测试用例设计。在使用PICT时,需要输入与测试用例相关的所有参数,以达到全面覆盖的效果。
我们知道成对组合覆盖这一概念是Mandl于1985年在测试Aad编译程序时提出来的。Cohen等人应用成对组合覆盖测试技术对Unix中的“Sort”命令进行测试。测试结果表明覆盖率高达90%以上。可见成对组合覆盖是一种非常有效的测试用例设计方法。
但是实际工作过程中有成对组合量太大,PICT就很好的解决了这一难题。
以下面的参数组合为例
帐户名: 空,不存在,超长,超短,正常
密码: 空,超长,超短,不匹配,正常
验证码: 空,超长,超短,不匹配,正常
会话: 保存一个月,保存三个月,保存一年,不保存
按钮: 确定,取消
有1000多种组合。对其做测试,非常困难的。用PICT的话就非常方便,测试用例的数量将大大降低;同时,也可保证很高的测试覆盖率。
PICT
所谓正交试验法,就是从大量的试验点中挑选出适量的,有代表性的点,合理的安排试验。
如果我们直接在上例中运用正交试验法,可能仍然达不到我们可以接受的范围,即测试用例还是很多。这时我们可以计算各因子和状态的权值,删去一部分权值较小,即重要性较小的因子或者状态,使最后生成的测试用例集缩减到我们可以接受的范围。
allpairspy
正交分析方法强调两两组合覆盖会覆盖到所有单参数、所有参数两两组合以及部分参数多组合的场景,会抛弃一些多组合场景。正交设计方法有利于确定各个因素对实验结果的贡献,但是对于组合测试提高错误检测能力并没有帮助。组合分析是随机生成的,它的原则是覆盖即可,多考虑覆盖多组合情况。
组合分析法是一种基于每对参数组合的测试技术,考虑参数之间的影响是主要的错误来源,并且大多数的错误起源于简单的参数组合。但是对于单参数以及两两组合覆盖率不如正交设计方法。
正交设计方法由于是基于两两组合,故对同一对象多次设计用例变化不是太大,而组合分析运用PICT可以很方便的获取一组测试数据,而且每组测试数据均不同,在回归测试中,可以很方便的运用另一组组合分析数据,提高测试覆盖率。
运用正交试验分析和组合测试都需要对要测试的因子及因子状态有清楚的了解,并对其加权,哪些权值较重,哪些较轻,可以删减因子,减少测试用例数。具体运用哪种方法,要看具体测试对象,也要看测试人员自己的喜好。
正交设计是组合设计的一个具体特例,也是组合测试的一种方案选择。
执行用例有了,那如何对用例结果判断呢?要实现自动化做好的解决办法,就是规范用例的response判断,什么场景用什么状态码,响应内容去哪个值可以做到对结果的校验,这些肯定要后端写清楚,难道要让我们看代码啊,那要后端干什么呢。
总结下接口文档或者是mockAPI需要规定的东东吧:参数是否可选、参数的类型|长度|特殊字符的response、参数的限制是在哪里(尽量是后端限制参数的所有东西)、是否需要token、response信息(不要只是code,还有具体的那个json值)…
比如:查询用户信息,我们除了校验code,还要对查询的内容是否正确啊。
静态分析C语言代码的工具,通过它可以生成函数的调用关系
静态分析C语言生成函数调用关系的利器