2017年1月5日 星期四

单元测试第一弹——从软件开发生命周期谈单元测试

关于单元测试的重要性,本文不再赘述了。相信很多人都知道单测的重要性。但是在日常工作中写单测的人很少。很多项目的单测覆盖率和通过率一般都很低,尤其是web项目。
本文从软件开发的生命周期开始谈起,让我们站在一个全局的角度来看一下单元测试到底扮演着怎样的角色。

软件开发生命周期

一个软件或者系统,从开发到上线基本要经过以下三个步骤:持续集成、持续交付、持续部署。在The Product Managers’ Guide to Continuous Delivery and DevOps一文中详细介绍了这三个阶段。

持续集成

jicheng
持续集成(Continuous Integration)是指在软件开发过程中,频繁地将代码集成到主干上,然后进行自动化测试。
我们集团内部有持续集成的平台,可以直接在上面运行自动化测试。其实如果没有这样的平台,开发人员也可以做持续集成。
其实持续集成就是git commit + mvn clean install。注意,这里的maven命令不要加-Dtest.skip

持续交付

jiaofu
持续交付(Continuous Delivery)是指在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的“类生产环境”(production-like environments)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的 Staging 环境中进行更多的测试。如果代码没有问题,可以继续手动部署到生产环境中。
这一步是在上线前的最后一次测试了,是在一个和生成环境一样的环境中进行测试。

持续部署

deploy
持续部署(Continuous Deploy)是在持续交付的基础上,把部署到生产环境的过程自动化。持续部署和持续交付的区别就是最终部署到生产环境是自动化的。

上面这三个阶段,都提到了一个词,那就是自动化测试。
自动化指软件测试的自动化,软件测试就是在预设条件下运行系统或应用程序,评估运行结果,预先条件应包括正常条件和异常条件。

软件测试

现在我们知道,一个软件的从无到有或者每一次迭代都需要通过持续集成、持续交付、持续部署三个阶段。而每一个阶段都伴随着自动化测试,这足以看出测试的重要性。既然提到自动化的软件测试,那么我就要搞清楚到底什么是软件测试。
test
软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。
目前,被普遍认可的软件测试包括以下几个阶段:

单元测试

单元测试是对软件组成单元进行测试,其目的是检验软件基本组成单位的正确性,测试的对象是软件设计的最小单位:函数。

集成测试

集成测试也称综合测试、组装测试、联合测试,将程序模块采用适当的集成策略组装起来,对系统的接口及集成后的功能进行正确性检测的测试工作。其主要目的是检查软件单位之间的接口是否正确,集成测试的对象是已经经过单元测试的模块。

系统测试

系统测试主要包括功能测试、界面测试、可靠性测试、易用性测试、性能测试。 功能测试主要针对包括功能可用性、功能实现程度(功能流程&业务流程、数据处理&业务数据处理)方面测试。

回归测试

回归测试指在软件维护阶段,为了检测代码修改而引入的错误所进行的测试活动。回归测试是软件维护阶段的重要工作,有研究表明,回归测试带来的耗费占软件生命周期的1/3总费用以上。

在整个软件测试的生命周期中,以单元测试开始,然后依次是集成测试、系统测试、回归测试。
软件测试的四个阶段,无论是复杂性还是成本,都是依次递增的。这个其实很好理解,当我们测试一个函数的时候发现问题简单,还是做整个功能的演示的时候发现问题简单?当我们在测试函数的时候发现问题好修改还是做功能演示的时候发现问题好修改?答案,不言而喻。
%e5%8d%95%e6%b5%8b

单元测试

至此,我们知道,整个软件的上线过程中,都要进行自动化的软件测试。而软件测试主要有四个阶段:单元测试、集成测试、系统测试、回归测试。
那么,单元测试作为测试的第一个阶段,是发现和解决问题需要付出的成本最小的。那么,到底什么是单元测试?
单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。
其实,可以很简单的说,就是我们在写代码的时候,对我们写出来的每一个重要的方法进行测试。
本文暂时不打算对单元测试涉及到的技术做详细介绍。后面我会有文章分专题的介绍单元测试涉及到的技术。目前我能想到的可能涉及到主要技术及知识点主要有以下这些:
  • 什么地方改写单测
  • 单元测试框架
  • spring与单测框架的融合
  • 数据库的单元测试
  • 服务的mock测试
  • 覆盖率
  • 测试类及方法的命名
  • 单测编写规范
这个专题我会持续做完,欢迎持续关注,同时也欢迎补充~

总结

单元测试贯穿整个软件开发的声明周期,无论哪个阶段都离不开单元测试。单元测试就是对程序的模块最测试。在面向对象编程中,主要是对函数的测试。单测涉及到的知识和技术比较多,本文暂时不做详细介绍。后面会逐一分析。

参考资料


0 意見:

張貼留言