qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

测试驱动开发在系统中的设计实现及效能分析

 3.2.3 详细设计、编码、测试阶段

  对上述几个需求点进行详细设计、编码和测试。最后对单元模块的具体实现方案如下:

图1 测试驱动单元模块的基本结构

  如图所示,整个系统分为两个部分:实现产品功能等需求的“应用模块(Application Module)”、实现测试驱动开发的“测试模块(Test Mt,dule)”。

  测试模块又分为3个子模块:输入子模块、输出子模块、处理子模块。“输入子模块”主要是接收外部的一些命令;“处理子模块”主要是接收已经经过“输入子模块”过滤、解析的命令,然后与应用模块进行信息的查询、收集、控制等操作,再把一些信息传递给“输出予模块”;“输出子模块”就接收“处

  理子模块”传递过来的信息,并把它呈现出来。由这个测试模块来实现前面总结四个方面的17条测试驱动需求。比如“自动化测试脚本支持”这一需求:如果后期测试人员要做一个自动化测试,就可以在测试模块的界面输入测试脚本,这些测试脚本由“输入子模块”进行处理后传达到“处理子模块”;“处理子模块”对这些脚本逐条进行解析转化成应用模块“认识”的命令,然后去向应用模块进行查询信息、对应用模块进行控制下达操作命令......这样处理完之后,把一些需要输出的信息,比如执行结果、成功失败等信息传递给“输出子模块”;最后经过“输出子模块”把结果、信息给测试人员看。这样设计的优点在于,不管应用如何升级、如何改变,只要应用模块与测试模块之间的接口不变,这个测试模块就都可以起作用。

  4、效果分析

  该项目总代码行为15.3K,其中测试驱动代码行为6.6K(测试模块的代码量),测试驱动代码占总代码的43%。

  (1)通过测试驱动开发可以提高测试效率、定位bug效率

  用“测试并定位1个bug所需人天”作为测算指标,这个指标的计算公式。3 o如下:(测试所投入的人员天数+定位bug所投人人员天数)/测试阶段所发现的全部bug,得到“测试并定位1个bug所需人天”这个指标。选取了一个没有实现测试驱动的项目作比较,该项目的测试效率:

  测试并定位1个问题所需人天=2.93人天

  而在这个实现了测试驱动的项目的系统测试投入人天及定位bug投人人天共368人时=46人天,共发现并定位bu932个,测试效率如下:

  测试并定位1个问题所需人天=46人天/32=1.44人天

  这个测试效率明显提高很多,在发现的32个bug中,大部分的bug是可以根据系统所提供的测试驱动手段很快定位的。

  (2)通过测试驱动开发可以降低测试成本

  开发设计的投入成本相比测试成本是要低的,开发投入的成本主要是人员、PC机;而测试投入的成本主要是人员、设备,设备是测试成本中占比重最大的。测试环境要包括所有组网设备、还有测试所需的设备,都是非常昂贵的。对于没有实现测试驱动开发的项目,测试人员往往需要自行开发一些测试工具,对系统进行测试,而且首先要先熟悉该系统去了解开发人员的设计和开发思路,然后才能进行完善的测试,而这是很浪费时间和人力。而实现测试驱动开发的项目就可以把这一步简化为只需要测试人员写测试脚本、甚至可以把这一步完全略去。所以可以通过前期测试驱动的投入来降低后期测试所需要投入的成本,效果非常明显。

  (3)通过测试驱动开发可以降低“不可重现/随机重现”bug的比例

  实践证明,通过测试驱动开发,大大降低了“不可重现/随机重现”bug的比例。这类问题是系统的很大隐患。通过测试驱动开发,因为很多会出现问题的地方都打印了相关信息、同时也提供很多方法来进一步的定位控制,大部分以前认为是“不可重现/随机重现”的bug都可以抓到蛛丝马迹,最后来定位和解决。

  (4)通过测试驱动开发可以提高开发设计文档的质量

  以前系统开发的模式,是开发人员进行开发,测试人员根据开发人员完成的各种文档进行各类测试计划的撰写、进行测试,这样的模式下,开发与测试是完全独立甚至对立的立场。在整个测试驱动项目开发的过程中,对于测试驱动需求的实现都是由开发人员来完成的,这样就有两方面优点:

  (1)促使开发人员从测试的角度来考虑问题、来进行设计。

  (2)当开发人员在对测试需求进行设计时,也会促使他对已经完成的sRS、HLD等设计文档进一步的进行反思,进而促进设计文档的正确性、完备性,提高前期设计的质量。经验证明,大型软件的问题多是前期设计不当引起的,所以提高前期设计的质量尤为关键。

 摘要:介绍测试驱动开发(TDD),以某通讯系统中测试驱动开发实现为例,从理论与实践上论证了在复杂系统中测试驱动开发可提高测试的效率,在整体上确保系统的安全可靠性。

  关键词:软件测试;TDD;测试驱动开发;cMM;软件能力成熟度;自动测试脚本;

  1、简介

  为了在软件发布前发现尽量多的问题,在开发结束后进行测试,进而为了在软件开发的前期发现尽量多的问题,而在软件开发的过程中引入测试。随着软件产业的迅猛发展,尤其在通讯、航空、国防等大型复杂系统的研制中,对系统的可靠性、安全性要求尤为重要,为了提高系统的开发效率,在软件开发的概念阶段就把测试作为需求进行设计,即测试优先的理念,也就是测试驱动开发。

  2、测试是确保软件质量的重要手段

  软件工程的发展提出在软件开发的过程中、在开发的每一个阶段对软件的质量进行监控,以便生产出高质量的软件产品,测试体现在软件开发的每一个阶段中,这也就是CMM所强调的一种理念。现代的软件开发工程是将整个软件开发过程明确的划分为几个阶段,将复杂问题具体按阶段加以解决。在软件的整个开发过程中,可以对每一阶段提出若干明确的监控点,作为各阶段目标实现的检验标准,从而提高开发过程的可见度和保证开发过程的正确性。实践证明,软件的质量不仅是体现在程序的正确性上,它与编码以前所做的需求分析,软件设计密切相关。因此,为了保证软件的质量,应该着眼于整个软件生存期,特别是着眼于编码以前的各开发阶段的工作。广义的软件测试由确认、验证、测试三个方面组成:

  (1)确认:评估将要开发的软件产品是否是正确无误、可行和有价值的。包含了对用户需求满足程度的评价,确保一个待开发软件是正确无误的,是对软件开发构想的检测。

  (2)验证:是检测软件开发的每个阶段、每个步骤的结果是否正确无误,是否与软件开发各阶段的要求或期望的结果相一致。验证意味着确保软件开发过程的正确无误。

  (3)测试:与普通的测试概念统一。通常经过单元测试、集成测试、系统测试三个环节。

  在整个软件生存期,确认、验证、测试相辅相成,分别有其侧重的阶段。确认无疑会产生验证和测试的标准,而验证和测试通常又会帮助完成一些确认,特别是在系统测试阶段。

  3、测试驱动开发

  3.1 测试驱动开发的提出

  测试驱动开发的理念强调把测试作为开发过程的一个主要部分,比如在软件的需求阶段,把测试作为需求的一部分,在软件开发的每一个阶段,都有一部分的设计和代码是专门为测试而服务的。这样在编码之前先设计测试方案,从测试的角度验证设计,推导设计,同时将测试方案作为编码的准绳,实时验证其正确性。

  下面具体介绍某无线网通讯系统中实现测试驱动开发的过程,以及取得的结果。

  3.2 测试驱动开发设计实现

  在需求分析阶段集合开发设计人员、测试人员讨论测试需求,然后在该项目开发的后续每一个阶段来对这些测试驱动需求进行设计,最终在编码阶段实现并在测试阶段测验其效果。

  3.2.1 需求分析阶段

  在需求分析阶段通过综合讨论与论证,确定了以下4个方面的测试需求:

  (1)可观察性需求:开发出来的软件是可观察的。比如发生故障时会以告警、调试信息等方式以供查看。

  (2)可控制性需求:开发出来的软件是可以控制的,并且不影响其正常运行。比如说当发生某一严重故障时,可以通过使用某一预留的功能开关来定位、解决。

  (3)协议测试需求:要满足该软件特定协议的规定和要求。比如要对这个协议进行测试需要一些特定的观察点,那这个软件就可以把这些观察点的值输出来以供对比、甚至可以自行比较并在最后输出一个是否符合该协议的测试结果。

  (4)业务测试驱动需求:要满足特定业务流程的规定和要求,把一些特定的阶段输出来以供对比是否符合标准流程、甚至可以自行比较并在最后输出一个是否符合该标准流程的测试结果。

 3.2.2 概要设计阶段

  在概要设计阶段对以上四个方面进行设计,并且讨论具体的实施投入产出比,最后确定了以下17个具体的测试驱动实施方案:

  (1)可观察性需求

  ·告警:主要是提供一些预警的信息。可以分为几个级别:致命告警、严重告警、重要告警、次要告警等。

  ·日志:主要是把一些运行过程中出现的一些情况等记录下来,可以在出现问题时供查看。

  ·调试信息:系统自己打印出来的一些信息,可以给用户查看系统现在运行的状况。调试信息要注意可读性、实用性、规范性。

  ·出错信息:系统发现哪个地方出错,就给出信息以便用户参考。

  ·统计信息:主要是一些系统相关的统计信息,如统计在线的用户个数、掉线的用户个数等等。

  ·资源使用情况统计信息:查看系统一些资源的使用情况,如某个现在剩余端口数等信息。

  ·CPu占用率统计信息:查看系统cPu占用率,比如使用嵌入式操作系统pS0s或者VxWorks,可以提供手段来查看某个进程、各个进程占用CPU的情况。

  ·接口消息打印等:系统内部各个子模块之问的接口消息可以打印出来,检查是否正确。

  (2)可控制性需求

  ·重定向功能:可以选择输出方式,例如把要打印到屏幕的信息,通过设置改为打印到某一文件。

  ·分级调试开关:调试信息分级,设置为某一调试级别就可以看到该级别下用户可以看到的调试信息;这样有助于定位问题、也有助于一些内部设计信息的保密陛。

  ·外部消息模拟:可以实现模拟外部消息的功能,这样就可以减少对外部的依赖性。

  ·自动化测试脚本支持:可以通过编写一些测试脚本,来进行一些自动化测试。

  (3)协议测试驱动需求

  ·协议报文打印:如协议一些关键字段的打印。

  ·协议各消息统计:统计某协议各类消息的数量,尤其是当要跟其他产品进行对接时这个功能很重要。

  (4)业务测试驱动需求

  ·接续跟踪:具体业务所需的功能,可以让用户很直观的看到系统处理的过程。

  ·状态迁移:具体业务所需的功能,比如该系统设计了一个状态机,那么通过打印状态迁移过程可以很明显的判断处理是否正确、问题出现在哪一步。

  ·分类的业务相关统计信息:可以根据不同业务类型来进行统汁,这样可以过滤掉一些所不需要的信息。


posted on 2013-06-06 10:35 顺其自然EVO 阅读(249) 评论(0)  编辑  收藏 所属分类: 测试学习专栏


只有注册用户登录后才能发表评论。


网站导航:
 
<2013年6月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜