单元测试就是测试应用程序的单个单元或组件,来验证这些单元是否正常工作。一般来说,一个单元应该是应用程序的一小部分——以Java语言为例,在Java中,它通常是一个类。值得注意的是,“单元”的概念是相对的,它可以是一个类,也可以是一个方法,也可以是其他粒度的单元模块。
大家常常会将“单元测试”与“集成测试”或“端到端测试”进行对比。不同之处在于,单元测试是为了验证单个可测试单元的行为,而集成测试是一起验证多个组件的行为,或作为一个整体来验证。就如上文所讲,“单元”的定义并不严格,单元的范围取决于实施者,如果范围过于宽泛,我们可能无法确定测试失败的原因。
从这些点来看,单元测试其实并不是一件简单的事。它需要投入大量的专业技能和时间。这次我们将提供一些有用的技巧以及更佳实践,可以帮助用户改进和提升单元测试。
单元测试能够非常可靠地保证软件质量,并且有着许多好处。正是有着这些好处,我们做单元测试才有意义:
单元测试验证了软件的每一个部分不仅在今天正常工作,而且在之后的阶段依然能够继续工作,为之后的开发提供了坚实的基础。设想一下,如果今天完成的代码,在明天就出现了问题,这该如何继续接下来的开发工作啊!
单元测试在整个软件开发过程的早期阶段就能识别缺陷,这降低了在开发周期的后期阶段修复缺陷的成本。单元测试不仅大大减少了用户后期的工作量,而且节省了时间和资金成本,这是非常有价值的。
经过单元测试的代码通常更安全,因为我们可以将测试快速重新运行,来验证代码没有变动。
编写单元测试让开发人员在开发前期就要考虑代码的设计,以便顺利进行单元测试,促使开发人员从不同的角度去审查他们的代码,鼓励他们在实现功能的同时也考虑极端情况和可能出错的条件。
在代码审查过程中,通过单元测试可以看出修改后的或新的代码应该如何工作。另外,审查人员还可以判断出单元测试本身是否良好。
实际上在大多数情况下,开发人员要么根本不编写单元测试用例,要么没有编写足够的测试用例,要么就是没有维护写好的测试用例。单元测试有时确实比较难编写,维护也是比较耗费时间精力的。基本上开发人员都会有一个项目截止日期,大家就会觉得分出一部分时间来做单元测试会导致完不成预期任务。但是不编写单元测试用例或不编写好足够的单元测试用例,将会是一个巨大的隐患。
因此,以下关于如何编写整洁的的、可维护的、自动化的测试用例的更佳实践建议是非常有针对性的,也是极其有效的,这些建议方案可以花最少的时间和精力获得单元测试的所有好处。
让我们来看看构建、运行和维护单元测试的一些更佳实践,这对我们如何做好单元测试非常有帮助。
单元测试用例应经过充分测试,并且能够通过单元测试和其他标准软件测试实践来证明。
当代码发生更改时,通常需要更新测试,也可能需要调试测试。因此,单元测试用例必须易于阅读和理解,不仅对编写者,对其他开发人员也是如此。为了可维护性和可读性,我们需要组织好测试用例,并且取一个易于理解的名字。
测试应该可以按任何顺序在任何机器上运行,并且相互不受影响。通常情况下,测试应该不依赖于环境因素或全局或者外部因素。这些依赖关系会导致测试更难运行,并且在很多情况下不稳定,使得测试用例更难调试和修复,最终耗费的时间大大多于预期时间。软件开发教父Martin Fowler几年前写的《“solitary” vs “sociable” code》这本书,也强调了单元测试应该独立分开,并且减少对其他因素的依赖。
确保单元测试是在一个自动化的工作流程中的。这个自动化流程可以是一天一个周期的,或每一个小时一个周期的,或在一个持续的集成或交付工作流中等等。与此同时,我们要保证团队中的每个人都能访问并审查这些单元测试报告,这些报告中数字的及时变化反馈通常可以帮助团队及时发现问题并且修复问题。
其实将单元测试自动化的工作做好做扎实,才是真正的好的开始。单元测试自动化是测试工作的地基,牢牢打好地基,再多的测试也不怕。
当然了,这并不是单元测试更佳实践的全部内容,但是遵循这些内容的指导,同时结合测试工具,我们不仅能快速高效地完成单元测试,并且可以大大提升单元测试的价值。
Parasoft的全线产品不仅支持多语言,而且不管是从静态代码分析、单元测试、集成测试到API测试和压力测试等测试维度,Parasoft的产品都是完美支持的。
Parasoft DTP也具有强大的报告中心功能,能够支持强大的图形化报表,可以一目了然地观察项目的覆盖率,并且可以显示行业合规标准的合规情况,同时管理者可以对团队进行管理,大大提升工作效率。