这是按阶段将测试分类,是一种测试策略。在测试过程中应依据每个阶段的不同特点,采用不同的测试方法和技术,指定不同的测试目标。
一、单元测试与集成测试
1 单元测试的目标与任务
1.1 这些单元可能是一个对象或是一个类,也可能是是一个函数,或组件或模块。一般情况下,被测试的单元能够实现一定的功能,具有一定的独立性,同时又通过明确的接口定义与其他单元联系起来。单元测试不仅仅是测试代码的功能性,还需确保代码在结构上可靠且健壮,能够在各种条件下(包括异常条件)给予正确的响应。
1.2 通过单元测试,需要验证下列这些内容:
(1)数据或信息能否正确的流入和流出单元
(2)在单元工作过程中,其内部数据能否保持其完整性
(3)在数据处理大的边界能否正确工作
(4)单元的运行能否做到满足特定的逻辑覆盖 (判定覆盖、条件覆盖、判定条件覆盖、条件组合、基本路径覆盖,在设计测试用例时)
(5)单元中发生了错误,其中的出错处理措施是否有效
细(6)指针是否被错误引用、资源是否及时被释放
节(7)有没有安全隐患?是否使用了不恰当的字符串处理函数等。
1.3 活动
(1)建立单元测试的环境
(2)测试脚本(测试代码)的开发和调试
(3)测试执行及结果分析
1.4 单元测试的任务
(1)单元独立执行路径测试:对每一条独立执行路径进行测试
(2)单元局部数据结构的测试:检查临时存储的数据在程序执行过程中是否正确、完整。
检查是否有以下几类的错误:a.不合适或不相容的类型说明。b.变量初始化或缺省值有错。c.变量无初值。d.不正确的变量名。e.出现上溢、下溢或地址异常。
(3)单元接口测试:数据能正确输入输出。
(4)单元边界条件测试
(5)单元容错性测试:针对出错进行正确的处理。
(6)内存分析
2 静态测试
静态测试技术是单元测试中重要手段之一,在代码完成并无错误地通过编译或汇编后进行,采用工具扫描分析、代码评审等。
3 动态测试
3.1 驱动程序和桩程序
运行被测单元,隔离被测单元,根据被测试的单元接口,开发相应的驱动程序和桩程序。
驱动程序:模拟被测试模块的上级模块
桩程序:模拟被测模块工作过程中的下层模块
3.2 类测试
面向对象的单元测试通常是对一个基类或其子类进行测试。对于类的单元测试可以看作是对类的成员函数进行测试。
不会对每个成员及方法进行测试,但对于核心或重于的方法需要进行全面测试。
4 分层单元测试
很多应用程序是分层的,如数据访问层、业务逻辑层、表示层等,所以咱进行单元测试时分层进行
4.1 Action层的单元测试
主要接收页面传来的参数,然后调用业务逻辑层的封装方法,最后负责跳转到相应的页面。主要进行跳转测试。
使用Mork对象,是隔离外部依赖的一个有效办法。
4.1.1 Moak对象
Mork就是模型,模拟测试时所需的对象及测试数据。
StrutsTestCase是Junit TestCase的基类,提供基于Struts框架的代码测试。
MorkStrutsTestCase,是对Junit TestCase基类的扩展
CactusStrutsTestCase,是对Cactus ServletTestCase基类的扩展
4.2 数据访问层的单元测试
业务逻辑层,一般用于处理比较复杂的逻辑,也用于DAO层的数据操作。
( DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰,DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置)
Junit,Mork对象,mork object,Dbunit
4.3 Servlet的单元测试
选择HttpUnit
5 单元测试工具
5.1 针对单元测试一般根据不同的编程语言和不同的开发环境
针对C/C++的单元测试工具:Cppunit,Parasoft C++ Test等
针对Java语言的单元测试工具:Parasoft Jtest,Junit等
.NET:NUnit
HTML:HtmlUnit
JavaScript:JsUnit
PHP:PhpUnit
5.2 分为静态测试工具和动态测试工具
支持Java语言检测:CheckStyle、FindBugs、PMD等
支持C++语言:Parasoft C++Test
5.3 按功能特点进行分类
内存资源泄露检查工具:Numega中的BounChecker,Rational的Purity等
代码覆盖率检查工具:Numega中的TrueCoverge,Rational的PureCoverge等
代码复杂度检测工具:SourceMonitor
6 系统集成的模式与方法
集成
测试是将已分别通过测试的单元按设计要求集成起来再进行测试,以检查这些单元之间的接口是否存在问题。
6.1 集成测试的模式
集成模式是软件基础测试中的策略体现,包括两种
(1)非渐进式测试模式:先分别测试每个模块,再把所有模块按设计要求放在一起结合。
(2)渐增式测试模式:把下一个要测试的模块同已经测试好的模块结合起来进行测试,一个一个扩展。
6.2 自顶向下与自底向上集成方法
6.3 混合策略
6.4 持续集成
二、系统测试
测试整个软件,包括好几个部分,如功能性测试、非功能性测试、性能测试、安全性测试、容错性测试、兼容性测试等。
1 系统级功能测试
不仅考虑模块之间的相互作用,而且要考虑系统的应用环境,其衡量标准是实现产品规格说明书上所要求的
1.1 功能测试要求
主要归为界面、数据、操作、逻辑、接口等方面
1.2 Web服务器的功能测试
支持HTTP/1.1协议,包括HTTP认证和SSL(安全套接层)、TLS(传输层安全协议)等;
支持虚拟主机、支持通用网关接口、具有用户会话的跟踪能力等;
与脚本语言(PHP、Perl、Python)集成、支持Java Servlet、支持代理(Proxy)、高速缓存、URL、
1.3 web功能测试工具
selenium,WebTest等
1.4 客户端测试工具
AutoIT、QTP等
1.5 嵌入式测试工具
2 回归测试
验证被修复的软件缺陷是否真正被解决,而且要保证以前所有运行正常的功能依旧正常。
2.1 回归测试的基本过程
(1)识别出软件中被修改的部分
(2)从原基线测试用例库T中,排除所有不再适用的测试用例,确定那些对新的软件版本依然有效的测试用例,建立一个新的基线测试用例库T0。
(3)依据一定的策略从T0中选择测试用例测试被修改的软件
(4)如果回归测试包不能达到所需的覆盖要求,必须补充新的软件测试用例使覆盖率达到规定的要求,生成新的测试用例集T1,用以测试T0无法测试的软件部分。
(5)同T1执行修改后的软件
2.2 策略
(1)再测试所有用例
(2)基于风险选择模式
(3)基于操作剖面的选择
(4)再测试修改部分
3 性能测试
为了发现系统性能问题或获取系统性能相关指标(如运行时间、响应时间、资源使用率等)而进行的测试。
3.1 系统性能指标与测试类型
3.1.1 性能指标
(1)请求响应时间
(2)事务响应时间
(3)数据吞吐量
等,针对具体的应用系统,性能指标应尽量明确。
3.1.2 测试类型
(1)性能验证测试
(2)性能基准测试:在系统标准配置下获得相关的性能指标数据,作为将来性能改进的基准线。
(3)性能规划测试:在特定的环境下,获得不同配置的系统的性能指标,从而决定在系统部署时采用什么样的软、硬件配置。
(4)容量测试
3.1.3 手段
(1)渗入测试:长时间预习的负载测试(压力测试),使用固定数量的并发用户测试系统的健壮性
(2)峰谷测试:为了更快的发现资源泄露问题,采用负载忽高忽低的方式进行测试
3.2 系统负载及其模式
系统负载可以看作是“并发用户并发数量+思考时间+每次请求发送的数据量+负载模式”
负载模式就是加载的方式:一次加载、递增加载、高低突变加载、随机加载
3.3 性能测试的基本过程
(1)确定性能需求
(2)根据测试需求,选择测试工具和开发相应的测试脚本
(3)建立性能测试负载模型:确定开发虚拟用户的数量、每次请求的数据量、思考时间、加载方式、持续加载时间等。
(4)执行性能测试
(5)提交性能测试报告:包括性能测试方法、负载模型和实际执行的性能测试、测试结果及分析等
3.4 性能测试结果分析
3.5 系统性能测试工具
JMeter:Web服务器的性能测试、数据库、FTP、LDAP服务器等
nGrinder
Apache提供的一个简单的命令行性能测试工具ab
HTTP工程包含一个名为HTTPD-Test
Siege
OpenSTA
DBMonster
LoadSim
JProfiler:服务器性能测试
3.8 压力测试(强调测试、负载测试)
模拟实际应用的软硬件环境及用户使用过程的系统负荷,长时间或超大负荷地运行测试软件,来测试被测系统的性能、可靠性、稳定性等。
3.9 容量测试
4 安全性测试
一系列工具,待补充
5 容错性测试
主要检查系统的容错能力,检查软件在异常条件下自身是否具有防护性的措施或者某种
灾难性恢复的手段。如当系统出错时,能否在指定时间间隔内修正错误并重启系统。
6 兼容性测试
6.1 软件兼容性测试
6.2 数据共享兼容性测试
6.3 硬件兼容性测试
7 可靠性测试
三、验收测试
验收测试是在软件产品完成了功能测试和系统测试之后、产品发布之前所进行的软件测试活动,又叫交付测试。
1 验收测试过程
2 产品规格说明书的验证
3 用户界面和可用性测试
4 安装测试和可恢复性测试