单元测试的简介
首先讲单元测试的简介,我们先回顾一下做传统开发中的经典V模式,有需求分析,概要设计,详细设计,编码,对应的是测试、集成测试还有单元测试,这是简单的V模式。单元测试所在的位置?这和详细设计是对应在一起的。接下来介绍一下单元测试的特性。首先单元测试是开发者编写的一小段代码。用于被检测代码的一个很小,很明确的功能是否正确。一个是很小,一个是功能明确。通常来讲单元测试是用于判断特定条件下的函数行为,这是和第二点对应,一是强调明确,一是强调小。TDD是单元测试的,简单来讲是先写单元测试,再让程序和代码通过单元测试达到设计上也好,或者是业务上的需求。
单元测试流程介绍
接下来演示单元测试的简单流程,编写测试代码,编写完之后在整个项目中,可能有编译错误。如果通过编译完之后再运行这些代码会发现整个代码是没办法通过单元测试,接下来要为了实现通过代码,是单元测试,是编写代码,是运行,接下来是要重构。做项目会强调迭代,或是渐进式开发,我们要对代码进行重构或者优化,重构完之后再进入下一轮,然后是先写代码不断的演进。TDD首先是通过测试失败,完了之后下代码再重构通过绿色状态,不是为了让代码更加,让架构更合理的情况下做重构,而导致之前的业务没办法正常的工作,我们是要保证后面两个阶段通过单元测试。这里有一个TDD的比喻,有没有人说出建筑师砌墙师傅是怎么做,我们程序员是直接垒砖头这条基准线也是TDD里面的测试代码,这是一个标准。我们看一下一般的新手,或者是建筑工地上的很少见,但是在实际的软件开发过程中,这种人是非常多,尤其是新手,他会直接写代码,写按之后如何用,不能用再重新修改。有人会提出观点不行推倒重来,成本会相当的高。我们再回到建筑上,如果建筑也是用这种观点,不行的话再推倒重来,大家想想这后果。这是单元测试的相对形象的比例。单元测试是作为整个项目的机械,或者是建设上基准线。
为什么做单元测试?
在软件开发过程中有哪些阶段或哪些过程?做项目,做开发在整个开发过程中有哪些阶段?CCO、概要设计,详细设计,编码,单元测试,集成测试。软件开发有两个阶段,一个不断制造Bug的过程,一个是不断修复Bug,在设计市场上一样有Bug。测试对我们系统的关键性,蓝色的曲线是不断至少缺陷的曲线,大家可以看到在制造阶段有85%,发现阶段比较少,红色是修复缺陷的成本,单元测试的时候修复缺陷的成本会比较高。在后面的过程中会发现修复成本会越来越高。三条曲线在实际过程中应该有所感悟。我们用医生一个建议,有病要尽早看,不要拖。刚才曲线如果越往后拖成本会越高。再看单元测试所占的位置,这是紧接着我们的编码做的环节。虽然说模型很典型,而且是大部分公司做的模型,但真正做的时候,真正按模型执行的时候非常少。我再请问一下,在实践过程中,不管是Android开发,包括iOS或是其他的项目开发,真正做单元测试的有没有?
接下来介绍单元测试的优点,首先通过单元测试尽可能尽早发现缺陷,以减少维护成本。单元测试有助于加深对需求的理解,尤其在TDD模式会比较突出。有没有人理解TDD?测试驱动设计在这个TDD过程中,重点在于驱动。通过测试把整个项目转出来,过去是文档驱动,或者是设计驱动。
单元测试可以让第三方快速的理解接口的用法或者是设计思路,我们做一些相对大点的项目,可能会跟很多第三方的团队协作,我很想知道方法要怎么调用,可能用一段文档告诉你怎么调用。如果我有一段单元测试代码,是很明显,输入是什么,输出是什么,会出现什么异常,单元测试是涵盖到了。我们再看单元测试的时候,对于开发人员来讲是更加的生动,更加的直接。第三方接口包括项目组的其他成员,或者新进来的成员还有出去维护的人员。还有作为公共库的调用者,以及未来某个时刻的“你”,这个大家也很清楚,我们的记住消息是有限,可能记住近1、2个月的事情,但是更难的事情可能很难记住。尤其是记代码的时候,通过阅读你的单元测试,可以快速的理解过去写代码的意图,单元测试是本身是功能小巧功能明确,如果单看某一个单元测试,目的性很明确,可以快速的理解这段单元测试的目的是什么,这段代码的功能是什么。越高的测试覆盖率,发现潜在缺陷的几率越高。
Android的测试框架,这是集成开发环境的一部分,从架构上可以帮助开发商测试应用程序各个层次的各个方面,可以测试业务逻辑,可以测试界面,也可以测试更深层次的,比如数据库。Android测试框架提供了强大的实用的工具集。
Android测试套件的特性是基于JUnit,可以访问Android系统对象,提供Instrumentation框架可以控制和测试应用程序。测试框架与Adt集成,同时为其他IDE提供命令行工具。Android需要独立的项目做,和生产代码是相独立。测试程序的包名为:应用程序包+“.test”。使用Instru运行测试,尽可能地使用工具自动创建测试项目。
Instrumentation测试指令/装置,是在Android系统中的一系列控制方法,可以独立于应用程序,控制Android组件的生命周期。可以控制Android如何加载应用程序,测试项目与测试是在同个进程中。
测试基类,是不能使用Instrumentation框架,提供访问对象。
我们持续开发过程中,团队更多是基于Robotium,是另一种通过Instrumentation Test来完成Android交互式测试。它横矿多个Tct,支持功能测试,系统测试和接收测试。Android-Mock是一个Mock框架,能够mock上的接口和类。Rbolectric运行测试于普通的工作站,它并依赖于Android提供的测试框架。lesspainful提供了一个多设备平台自动化测试的服务,根据不同设备环境,自动执行测试并生成报告,支持HTC、LG……。
左侧是单元测试,右侧是出来的具体化的效果,实际上整个过程是做自动化的测试。开发人员会有所感触,我们在调试时,要看看效果是通过刷新页面。但是作为Android开发,或者是iOS非网页项目开发时,要测试一个功能只能一步步往前点,这块的开发成本和代价非常高,必须一步一步往下点,是鼠标点击的时间。单元测试强调的是一个自动化测试,或者是自动化测试的范围。
在实际开发过程中,一般不会为了某个功能做全路径的测试,全路径的测试一般会放在集成化服务器,会将错误的报告反馈给我们。