什么是单元测试?
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证,可以快速验证代码是否准确地实现了设计目的,帮助提高代码设计的合理性(能进行单元测试的函数,一定是低耦合的)和健壮性(遍历函数的逻辑路径,函数不发生意料之外的问题),还能发现代码中的缺陷和bug。
相比后续复杂的集成测试和系统测试,单元测试的创建和维护比较简单,发现的代码问题也容易定位和修复,具有高效率低成本的优势。
单元测试难落地执行的原因
1、开发人员不认为测试代码是自己的工作,而测试人员又很难真正了解代码的行为;
2、编写单元测试太花时间了,包括测试用例、测试驱动和测试文档等内容;
3、没有真正的测试运行环境。
当然,这也意味着微小厂商或公司,在测试软件时,处于成本及效率考虑或许不会使用主打单元测试的软件测试工具。
什么是自动化单元测试?
自动化单元测试是通过测试人员自己编写可复用的测试驱动和相关环境,或者借助一些框架或者工具,进行高效自动化的单元测试。
自动化单元测试的目的:
降低单元测试的时间和人力成本,构建便于管理、辅助设计、快速执行、数据复用的单元测试环境。
用自动化单元测试的方式,研发人员(通常建议单元测试由开发人员完成最为高效,但是开发人员通常项目任务紧,时间和精力不够)在用例设计、执行和数据管理上不需要再花费巨量的时间,就可能有足够的精力来真正进行和完成单元测试内容。
常见的自动化单元测试通常借助于各类测试框架或者测试工具
(一)单元测试框架
单元测试框架提供了一种统一的编程模型,可以将测试定义为一些简单的类,这些类中的方法可以调用希望测试的应用程序代码。
开发人员不需要编写自己的测试控制工具;单元测试框架提供了测试运行程序(runner),只需要单击按钮就可以执行所有测试。利用单元测试框架,可以很轻松地插入、设置和分解有关测试的功能。测试失败时,测试运行程序可以提供有关失败的信息,包含任何可供利用的异常信息和堆栈跟踪。
对于测试来说,单单的访问接口,实现不了跑不同的测试用例!
需要对测试用例进行封装为类/函数(单元)等一系列的工作才行,也可以理解为一个模板,照着模板写测试用例、执行用例、断言,以及输出测试报告等。
(二)单元测试工具
主要是指工具软件供应商提供的成熟完备的商用单元测试工具,商用工具通常具有单元测试框架包含的所有功能,其提供的功能更加强大,界面相对更加友好;
除此之外,商用工具还有完备的说明文档和及时的技术支持,也可以进行定制化开发。如果有相应的费用支持,商用单元测试工具是更加明智的选择。
(三)好用的单元测试框架或者工具,通常具有:
· 界面友好、展示丰富、功能清晰、说明完备——学习成本低,让使用者能快速上手;
· 良好的编译开发环境支持——不同的项目,用户可能会使用不同的开发环境,例如Qt、Keil、CCS等,如果只能支持少数环境,那么工具的适用性就会大打折扣;
· 良好的语法特性和数据结构支持——不支持的话,测试代码根本跑不起来;
· 好用的用例管理、数据分析和日志管理——支持用例复用,辅助设计覆盖更全面的测试用例集,日志管理则能帮助定位执行失败的原因,并且提供丰富的执行结果;
· 简单易用的标准模板测试报告生成功能——对于有测试报告文档要求的团队,这个功能也非常重要。几千页的报告,人工去编写,有这经历的人都不想再来第二遭。
用自动化单元测试的方式,研发人员(通常建议单元测试由开发人员完成最为高效,但是开发人员通常项目任务紧,时间和精力不够)在用例设计、执行和数据管理上不需要再花费巨量的时间,就可能有足够的精力来真正进行和完成单元测试内容。
几款好用的自动化单元测试框架的工具
unittes —— 基于python语言
unittest 单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果。
unittest为python内置库,通常不需要单独安装。
Junit —— 基于Java语言
JUnit 是一个编写可重复测试的开源框架。它是单元测试框架的 xUnit 架构的一个实例。JUnit提供断言测试预期结果、测试功能共享通用的测试数据、测试套件轻松地组织和运行测试、图形和文本测试运行。
Junit在业界有广泛应用,网上信息很多很全,也方便学习和集成。
iUnit、Visual Unit —— 基于C\C++语言
C\C++语言,尤其是C语言,多用于可靠性要求较高的领域,如汽车电子、航空航天、轨道交通方向的核心控制程序,因此相关行业对单元测试也都有严格的标准要求,多采用较为成熟的商业工具。
iUnit和Visual Unit都是国内厂商研发的单元测试工具,都具有较好的语言特性支持和友好的交互界面。两款工具都是支持用户全表格化操作,不需要再去编写任何测试代码,工具具有较好的用例管理、数据分析展示、报告生成功能。
此外,iUnit相比而言功能会更加全面一些,主要如下:
1)提供测试用例自动生成功能,自动生成测试用例集的语句覆盖率通常在80%-90%左右,这样大部分的用例设计工作可以由工具自己完成,用户可以在此基础上进行用例补充和优化,提高覆盖率情况或者对关注的核心函数增加测试深度。这一点对经常性项目周期紧(唉,经常性加班的程序猿举个手)加人员缺少的团队很有意义。
2)可以适配和部署国产环境,比如银河麒麟+飞腾,这个是一些国家秘密安全相关行业很关心的问题,也是一些国外工具的致命短板。
3)支持的开发环境很多,像用的比较多的CCS、tornado、Qt、Keil,甚至于国内自己开发的一些开发环境,翼辉、海迅、天脉等等
NUnit —— 基于C#语言
NUnit是一个专门针对于.NET来写的单元测试框架,它是xUnit体系中的一员,在开始的时候NUnit和xUnit体系中的大多数的做法一样,仅仅是将Smalltalk或者Java版本转换而来,但是在.NET2.0之后它加入了一些特有的做法。
NUnit完全用C#编写,并且编写时充分利用了许多 .NET 的特性,比如反射,客户属性等等。重要的一点是它适合于所有.NET语言。