众所周知,测试是在软件开发中是必不可少的一部分。测试是保证软件质量的重要手段,甚至可以称之为软件的生命。然而如何做好测试或者通过测试达到想要的效果,是一门值得研究的学问。
在很多软件开发公司,测试是最容易被高层领导和程序员忽略的一个环节。当一个项目进度非常紧急的时候,测试往往都是时间缩水最多的阶段。结果是使“重视测试,充分测试”成了一句话空话。
从软件工程角度上来说,我们项目的测试活动可以大概分为三个阶段,分别是测试计划,测试实施和测试分析。接下来将分别描述我们在项目开发活动中三个阶段是怎么做的。
[计划阶段]
第一,我们在项目的初期确定好开发方式并制定计划。在项目计划中增加一个测试设计师角色。测试设计师将专职从头以尾参与我们的项目开发活动,包括需求分析,系统分析,系统设计;并根据项目的每个阶段的文档如分析设计文档产生相应的测试计划和测试案例。测试设计师将测试计划汇报给项目经理作为项目计划的一部分。测试计划包含了每次测试的时间,人员,目标和测试方式.
第二,项目经理与测试设计师将确定测试的类型方式和每个阶段的应用的测试策略。在我们项目中采取单元测试,集成测试,系统测试,性能测试等四种主要测试方式在不同的阶段实施,并设产相应的测试目标。简单的说这个测试目标就是在某阶段要发现多少个Bug或者需要改进的地方。
第三,再好的计划都还是要靠人来实施。测试成功的关键还是需要靠项目组成员的积极性和责任心。大家都知道很多程序员都是讨厌测试,认为测试是一件浪费时间和却收不到任何实际效果的事情,所以项目经理和测试设计师都需要花一定的时间来动员程序员执行有效的测试。
[实施阶段]
按照项目计划和测试计划我们内部采用了四种测试方式,分别是单元测试,集成测试,系统测试,性能测试。在做系统设计初期就把系统可测性作为一个设计目标,因此我们项目采购目前流行J2EE多层架构技术,结合多个常用的J2EE设计模式如MVC, DAO, Service Locator, Value Object。结合J2EE开发指南和MVC,我们对整个系统发大概可以分成以下几个层次,Model(DAO,Service), Controller(Struts, Action), View(JSP, tiles, FormBean). 让项目给的人员分别在各个层面上进行开发。并要求每个功能开发完成后,单元测试和用例同时完成;当各个层次功能完成后我们对各个层次进行集成和进行集成测试,在集成测试期间要求所有程序员按照需求说明和设计分档提交一个每个功能点的Check List交给测试组的同事测试。所有的集成测试通过后,测试设计师将根据写好的测试用例组织系统测试。性能测试我们将在交由客户使用之前进行。以下将简单的说明各种测试是如何进行的:
1. 单元测试
Junit的作者曾经说过,软件开发如果没有单元测试就像人走在钢丝上,没有任何的保障. 由于我们项目是多层架构,在每个不同的层都使用了不同的测试工具。如在Service & DAO层,使用了Jbuilder + Junit, 在Controller&View层使用了Cactus作为主要的测试工具,通过与Ant的结合自动测试并生成单元测试报告。大家都知道,做单元测试没有足够的测试用例基本上没有效果的,所以我们在单元测试中设置了用例覆盖率的目标大概是80%,项目将通过JCoverage进行跟踪程序员的用例是否达到目标,以保证单元测试的质量。
2. 集成测试
集成测试的在我们项目中的目标是检查是各层次之间是否衔接成功,不会抛出无法捕获的异常。集成测试是在通过工具集成时同时进行,使用Ant+Junit+Cactus对所有的程序员的测试用例进行收集测试并生成测试报告。
3. 系统测试
系统测试是对整个系统进行一次全面的测试。在我们项目中系统测试将由测试设计师根据需求说明书和测试计划编写测试案例。在系统测试开始之前,项目经理安排程序针对自己所编码功能点进行分析,并提交一份功能检查表给测试设计师。功能检查表中包括了业务逻辑或者输入有效性检查等内容。测试设计师收到功能检查表后安排测试人员(程序员之间交叉测试或者第三方人员)根据检查表进行功能核对,如发现BUG,将记录JIRA(Issue Tracking Tools)上以便跟踪Bug的状态。
4. 性能测试
性能测试是在发布用户之前必不可少的一个步骤,一个系统的性能好坏将影响整个项目的成功与否。性能测试主要是通过Apache Jmeter进行压力测试,性能测试的包括页面响应时间和并发用户的承载量,在进行压力测试的同时使用profiler收集性能报告以收集系统的瓶颈所在。通过做性能测试我们发现了比较多的问题,如滥用事务,用户初始化时间过长,200人同时登录时系统将无法运行等情况。对此我们经过分性能测试报告,我们通过以下几种方法解决:
a) 从代码中去掉查询事务,单表写入事务
b) 减少与用户关联的数据,减低与用户对旬太紧密的关系
c) 调整应用程序服务器的初始内存和最大内存
d) 对DAO层和查询加上缓存
经过以上方案后,系统性能提高了40%以上。
[结果分析阶段]
结果分析是测试的重要环节之一。我们能过工具收集了bug的发生原因,引入阶段,修改时间,严重程度,类型等关键信息。根据以上的信息分析测试的效率和原因,以便形成公司的知识库文档和软件质量的数据库.