C/C++单元测试问答(摘要)

为何要进行单元测试?
单元测试保证局部代码的质量
单元测试改良项目代码的总体结构
单元测试下降测试、维护升级的成本
单元测试使开发过程适应频繁变化的需求
单元测试有助于提高程序员的能力程序员

由谁进行测试?开发部门仍是测试部门?
应该由开发部门进行单元测试!
由测试部门进行单元测试的问题:代价高,人手不足,耽误了测试部门对其余测试的准备工做。
由开发部门进行单元测试的问题:担忧影响开发进度,程序员不习惯作单元测试,测试本身编写的代码,难于保证测试的效果。
不管由哪一个部门作单元测试,都要面对一些问题,但开发部门所面对的问题能够借助工具来解决,而由测试部门进行单元测试,要么没法真正实施,要么代价昂贵。数据库

由测试部门进行单元测试为何成本昂贵?
需屡次重复理解程序
反复沟通须要大量时间成本
不利于发挥单元测试对代码结构的约束机制
耽误测试部门对其余测试的准备工做
即便测试部门人手充裕,仅仅从效益来考虑,也不该该由测试部门进行单元测试。若是测试部门原本就人力不充裕(进行单元测试的人员需具有编码能力),勉强由测试部门进行单元测试,结果每每是----没有结果。编程

由开发部门进行单元测试能保证测试效果吗?
程序员测试本身编写的代码,每每只考虑“正常情况”,这固然会影响测试效果。但若是所用的单元测试工具可以统计各类白盒覆盖率,就能检查测试效果。固然,只作到这一点仍是不够的,由于白盒覆盖具备逾后逾难的特色,达到必定的覆盖率后,覆盖率的提高会很困难。若是测试工具功能足够强大,能提供工具帮助用户快速地设计测试用例,达到完整的白盒覆盖,那么测试效果就能获得彻底的保证。
实际上,若是没有充分的统计数据,没有达到足够的测试完整性,那么由谁作单元测试,效果都不能保证。网络

边编码边测试会影响编码进度吗?
传统的单元测试是很费时费力的工做,主要时间消耗在于:编写测试代码、设计测试用例,若是开发工具能自动生成测试代码,而且具备快速设计测试用例的功能,那么测试费时就不多;另外一方面,若是测试工具还能提供数据,帮助程序员整理编程思路、快速发现错误,更高效地调试,那么就能大量提升开发效率,抵销测试所消耗的时间,不但不会影响编码进度,甚至加快编码进度。架构

实施单元测试须要改变开发流程吗?
边开发边测试,单元测试是编码行为而不是测试行为,测试代码看做是项目代码的一部分,程序员提交产品代码时也要提交测试代码和测试报告,其余流程能够不做任何改变。
另外一方面,在充分单元测试的基础上,因为具备高质量的局部代码,良好的总体代码结构,保证了代码的可扩展性和可复用性,同时,自动回归测试支持对代码的频繁修改而不用担忧引入新的错误,所以,开发流程天然会变得敏捷,能够适应频繁变化的需求,使系统分析、架构设计和后期测试的压力减轻,天然而有效地改进了开发流程。ide

单元测试测试哪些代码?
单元测试一般不测试很简单的代码,通常也不测试“边界代码”。很简单的代码容易理解,例如Get/Set函数,这里解释一下“边界代码”。“边界代码”是指用于与外部系统交互的代码,例如用于处理用户界面的代码。数据库、文件、网络均可以看做是外部系统,用于读写数据库或文件、或访问网络的代码也能够看做是“边界代码”,这类代码应该独立出来,能够进行单元测试,但对这些代码的单元测试一般不能自动验证预期输出,而是须要人工察看。编程时,不要把普通代码与“边界代码”混在一块儿,例如,不要把各类运算直接写在界面类中,作到了这一点,绝大多数代码均可以进行单元测试。 函数

实际工做中,单元测试能实现什么程度的测试覆盖?
单元测试的最低要求是100%语句覆盖,这个覆盖率仍是不够的,最好实现多种覆盖的组全,比较理想的覆盖率组合是:100%的语句、条件、分支、路径覆盖,另外,测试工具最好还能自动生成边界测试用例捕捉未处理特殊输入造成的错误。在达到这种覆盖以后,残留的编码错误能够几乎说没有了(设计方面的错误除外,这些属于集成或系统测试的范畴)。工具

单元测试如何改良项目代码的总体结构?
具备良好总体结构的代码,应该符合“低耦合”的特性,即具备“可测性”。测试不具备“可测性”的代码时通常会产生编译错误,或者须要打桩才能测试,从而将问题暴露出来。发现问题后,重构代码、消除不当耦合通常不难,这种简单的重构将有效地改良代码的总体结构。单元测试

我但愿依赖全自动的工具来完成单元测试,这一想法现实吗?
彻底自动化是一个美妙的愿望,但因为单元测试的基本特性,彻底自动化的单元测试是不现实的。
与其余不一样,单元测试是“隔离”的测试,要求代码具备可测性,一个项目甚至一个文件中,不免会有些影响可测性的代码,编译到这些代码时经常会产生编译错误,所以,全自动的单元测试工具每每只能测试小部分代码,即便使用某种技术手段屏蔽掉编译错误,也得不偿失,由于同时也屏蔽掉了改良代码总体结构的宝贵机会。若是采用自底向上的方式,一个一个文件测试,测试一个文件前,先将该文件加入测试工程并编译,没有编译错误时再测试,这样能够及时发现并消除不当耦合,使代码具备可测性,这种非全自动的方式,能够测试绝大多数代码,也保证了代码具备良好的总体结构。
另外一方面,主要由测试工具自动生成测试用例来进行测试每每没有实际意义,由于测试工具没法自动了解程序的功能,所以,自动测试用例一般只能发现异常之类的极端错误,大多数通常错误都是没法发现的。测试工具最重要的不是自动生成测试用例,而是能提供快速创建和编辑测试用例的工具。开发工具

若是由开发部门实施单元测试,那么测试部门要作哪些工做?推进、组织单元测试的实施。单元测试既然叫作“测试”,开发部门经常认识不到其重要性和必要性,须要由测试部门推进和协助组织实施。制定单元测试规范,培训单元测试技术。检查、审核单元测试结果,保证单元测试的有效性。 

相关文章
相关标签/搜索