8.1白盒测试之代码审查—提高测试效率必会
破索式—测试技术深化
8.1.1代码审查的范围
合格的代码应具备正确性、清晰性、规范性、一致性和高效性。
概括起来,代码审查的工作涵盖下列方面:
①业务逻辑的审查。
②算法的效率。
③代码风格。
④编程规则。
8.1.2代码审查的方法
①互查:就是在相同模块或相近模块的编程人员之间相互检查对方的代码。
②走查:从头到尾将写好的程序检查一遍。
③代码审查。
8.1.2.1代码审查的规则
(1)Java最基本语句的使用。
(2)重载函数的审查。
(3)内存分配和管理:当进行内存分配和管理时,很重要一点就是确保内存的及时释放和避免缓冲区溢出。
(4)程序性能的审查:
①减少创建对象。
②减少循环体的执行代码,能放在循环体外的代码要尽量放在循环体外。
③提高处理异常出错的效率。
④减少I/O操作时间。
8.2白盒测试之逻辑覆盖—测试更全面
8.2.1关于微信红包的测试需求分析
测试需求分析是测试工作的第一步:
①了解红包需求实现的背景。
②分析测试红包需求合理性。
③确定测试范围和优先级。
④查缺补漏。
8.2.2从单元测试说起
定义:
单元测试是软件测试中最基础的测试,集成测试、功能测试和 系统测试都建立在单元测试之上。单元测试的对象是构成软件产品或系统的最小的独立单元,如封装的类或对象、独立的函数、进程、子过程、组件或模块等。
8.2.3单元测试用例设计
对于单元测试用例的设计和进程的实现过程,主要集中在白盒测试方法之上,并力求达到下列测试要求:
1、对程序模块所有独立的执行路径至少要执行一次。
2、对所有逻辑判定,其结果为真、假两种情况至少要测试一次。
3、对程序进行边界检查(常见的如数据越界检验)。
4、检验内部数据结构的有效性。
8.2.4白盒测试方法之逻辑覆盖法
逻辑覆盖法是白盒测试中最主要的测试方法。
逻辑覆盖分为语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖,其基本思想不同,产生的测试用例不同,覆盖范围也有所不同。
eg:以代码为例分别介绍集中逻辑覆盖方法:
步骤:
将代码逻辑用现况流程图转化下:
(1)语句覆盖:
基本思想:设计若干测试用例,运行被测程序,使程序中的每个可执行语句至少被执行一次。
根据程序流程/路径图可以看出,该程序模块有4条不同的路径:
P1:(M-K-N-J-P)对应M=.T. and N= .T.
P2:(M-K-N-P)对应M=.T. and N= .F.
P3:(M-N-J-P)对应M=.F. and N= .T.
P4:(M-N-P)对应M=.F. and N=.F.
通过观察,我们发现:P1包含了所有可执行语句,按照语句覆盖的测试用例设计原则,只要设计一组测试用例覆盖P1路径,就可达到要求:如输入数据:a=2,b=1,c=6
语句覆盖的不足:
在使用语句覆盖进行测试用例设计时,能够使得所有的执行语句都被测试,但是不能准确判断运算中的逻辑关系错误。在这个例子中,如果程序将M的条件“(a>0 AND b>0)”写成“(a>0 OR b>0)”,这时的测试用例仍然可以覆盖所有可执行语句,但不能发现其中的逻辑错误。
(2)判定覆盖:
基本思想:是使每个判断的取真值和取假值都至少经历一次。
判定覆盖的限制:
例如:在上面的例子中,如果条件N中是“c<1”而不是“c>1”,则组合1的测试结果没有差别。
(3)条件覆盖:
基本思想:是使每个条件的取真值和取假值都至少经历一次。
那么:对于第一个判定条件M,可以进一步分为以下两种:
①条件a>0:取真时为T1,取假时为F1
②条件b>0:取真时为T2,取假时为F2
对于第二个判定条件N,可进一步分为以下两种:
①条件a>1:取真时为T3,取假时为F3
②条件c>1:取真时为T4,取假时为F4
保证每个条件至少有一次取真、取假(T1/F1,T2/F2,T3/E3,T4/F4),满足条件覆盖,但是覆盖了相同的路径P3。说明,即使做到条件覆盖,也不能保证覆盖所有路径(P1、P2、P3和P4)。
只是满足一种覆盖条件,还会遗漏程序逻辑路径或判断错误,依旧存在较大风险。所以,白盒测试要求同时满足两种以上的测试覆盖要求,测试的覆盖率才能满足质量要求,将风险降到最低。
(4)判定-条件覆盖:
基本思想:确保设计足够或精巧的测试用例,可使得判断条件中所有条件的可能取值至少被执行一次,同时,所有判断的可能结果也至少被执行一次。
(5)条件组合覆盖:
基本思想:设计足够的测试用例,使判断中每个条件的所有可能至少出现一次,并且每个判断本身的判定结果也至少出现一次。与判定-条件覆盖的差别是,条件组合覆盖不是简单地要求每个条件都出现“真”与”假“两种结果,而是要求让这些结果的所有可能组合都至少出现一次。
8.4自动化测试工具的介绍—工欲善其事必先利其器
8.4.1常用的WEB自动化测试工具
①SIKULI
②QTP
③UFT
④SELENIUM
⑤RFT
⑥WINRUNNER
(1)主流自动化测试工具—QTP:
QTP是一个侧重于功能的回归自动化测试工具;提供了很多插件。QTP支持的脚本语言是VBScript,这对于测试人员来说,感觉要“舒服”得多。VBScript毕竟是一种松散的、非严格的、普及面很广的语言。
QTP的高可用性:
①支持录制与回放。
②支持lower level模式。
③QTP的编辑器支持两种视图:Keyword模式和Expert模式。
(2)Selenium(WebDriver):
用与QTP比较的方式来了解二者的特征和优势。
①价格:selenium是开源的自动化测试工具,但是QTP是商业版的,而且价格不菲。
②应用领域:Selenium仅支持web页面的测试,而QTP不光支持web界面的测试,而且还支持Client方面的测试。
③功能方面:录制功能QTP支持的好。QTP的录制回放成功率很高;seleniun的录制回放成功率非常的低。脚本的编辑功能。熟悉java、python等的人喜欢selenium,熟悉的是VBScript可能就会喜欢QTP.
④框架处理的能力:在数据驱动方面,QTP支持很灵活。可以通过简单的设置就可以完成数据驱动的自动化脚本selenium要用编程来实现才可以。
(3)UFT:
UFT是QTP的新名字,叫统一功能测试架构。新的功能如下:
①Insight智能识别:图像识别一直是我们做自动化测试的阻碍之一。包含游戏自动化、flash动态的一些自动化。
②多脚本调试。
③PDF文本验证点:现在UFT可以识别PDF文件并对他们直接进行比较,甚至可以插入文本验证点。
④支持开源CI。
⑤支持移动设备。
(4)RFT:
IBM的一款适合于功能测试、回归测试的自动化测试工具。针对于java、.NET的对象技术和基于Web应用程序的录制与回放。
因为录制与回放功能对于程序运行的环境依赖性太大。因此更多使用该工具的测试团队采用了自己手动写脚本的方式来提高脚本的易读性以及可维护性。
框架结构:
①RFT的脚本可以分别被归类为AppPbjects、Tasks和Testcases。
②AppObjects:定义页面上的元素。
③Tasks:定义可以单元化,课重用的任务,调用在AppObjects中定义的元素。
④Testcases:一个case携程一个脚本,每个测试场景,可以写成一个或多个脚本,每个脚本只调用在Tasks中定义的可重写的任务。
为什么RFT的喜欢博和使用范围不大?
①帮助文档和教程很少,很不系统。而提供的API接口只有说明文档,未提供如何使用该文档;提供的例子很少。
②环境要求比较高,至少得1G内存才能比较顺畅使用,512M内存时比较卡,速度慢。
③参数化只支持使用Xml格式文件来存储测试数据。
④回放速度极慢。
(5)WINRUNNER:
老一代的自动化测试框架,是较早可以录制-回放-修改的自动化测试模式。与QTP类似,也会使用资源库方式存储空间,在06年以前,是测试行业使用最广的自动化测试工具。
2006年Mercury公司被HP全权收购,如今Winrunner已从HP产品家族中消失。除了HP自身推行QYP的原因外,它支持C语言的模式既成就了它在当时的盛行,也阻碍了它自身的扩展性。
(6)新型思路的自动化测试工具—Sikuli:
创新的图形化编程技术:
Sikuli是由MIT的研究团队发布的新型图形化编程技术。它以图像检索技术为基础,提供了一套基于Jyphon(python语言在java中的完整实现)的脚本语言以及集成开发环境。使用者可利用屏幕截图直接引进GUI元素进行编程,完成交互操作。
Sikuli脚本:
Sikuli的脚本编写遵循Python语法规范,其本身提供了多种自定义类及方法。Sikuli基于Jython,其核心代码由Java编写。通过一个自动打开Firefox浏览器,并登录Gmail的简单实例来快速一览Sikuli脚本的独特之处。
4.8.2自动化测试工具选择
①来源免费。
②使用灵活、简单。
③后期用例易于维护。
④支持多种语言。
⑤容易与单元测试框架结合。
⑥可支持多浏览器同时,支持远程启动其他服务器。
⑦高度复用性。
⑧代码可自主掌控,对于框架搭建、平台等有不可替代的优势。
8.5Selenium初窥—自动化必会的工具
8.5.1初识WebDriver
1、JDK安装
(1)官方下载(64/32位):http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
(2)配置JDK环境变量:
①打开控制面板->系统->高级系统设置->环境变量
新建环境变量:JAVA _HOME
变量值设置:JAVA安装路径
②新建(或更改)变量:PATH
变量值设置:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
③新建变量:CLASSPATH
变量值设置: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
④验证安装成功:Windows系统输入cmd->输入java -version
2、Eclipse安装
(1)官方下载:http://www.eclipse.org/
在启动之前,将eclipse.ini文件中java版本修改成当前系统版本。
3、Eclipse启动
新建workspase->启动eclipse。
4、TestNG集成
①在eclipse中选择Help->Install New Software。
②在Work with输入 http://beust.com/eclipse。
③搜索出TestNG,勾选后继续安装。
④安装成功后,进入Configure Build Path,查看存在TesrNG。
8.5.2主流浏览器调用方式
1、IE浏览器
需要将IEDriverServer.exe在本机的位置引入代码。
2、FireFox浏览器
最新的Selenium3.0需要将geckodriver的位置引入代码。
3、Chrome浏览器
需要将chromedriver.exe在本机的位置引入代码。
注:由于chromedriver.exe有版本之分,它的版本与chrome浏览器版本保持一致,需要在驱动下载的页面找到对应的版本进行下载使用。
驱动下载网址:http://chromedriver.storage.googleapis.com/index.html
8.6安全测试概述—可以装逼黑客
8.6.1Web安全测试介绍
1、Web应用的概念
①Web应用是由动态脚本、编译过的代码等组合而成。
②通常架设在Web服务器上,用户在Web浏览器上发送请求。
③这些请求使用HTTP协议,由Web应用和企业后台的数据库及其他动态内容通信。
2、Web应用三层架构
典型的Web应用通常是标准的三成架构模型。
8.6.2日常生活中的“安全”
日常网络行为与安全时时相关:
①为什么我们登录的时候经常要求我们输入一个验证码?
②在一个网站上长时间没有操作,为什么会session失效?
③为什么支付宝之类的支付接口都是https? https在传输过程中是加密的,系统仍然是不安全的
8.6.3从WASC和OWASP谈漏洞分类
1、WASC(Web Application Security Consortium)
(1)定义:
是一个由安全专家、行业顾问和诸多组织的代表组成的国际团体。他们负责为WWW制定被广为接受的应用安全标准。
(2)WAEC将Web应用安全威胁分为六大类:
①Authentication(验证):用来确认某用户、服务或是应用身份的攻击手段。
②Authrization(授权):用来决定是否某用户、服务或是应用具有执行请求动作必要权限的攻击手段。
③Client-Side Attacks(客户端攻击):用来扰乱或是探测Web站点用户的攻击手段。
④Command Execution(命令执行):在Web站点上执行远程命令的攻击手段。
⑤Infoemation Disclosure(信息暴露):用来获取Web站点具体系统信息的攻击手段。
⑥Logical Attacks(逻辑性攻击):用来扰乱或是探测Web应用逻辑流程的攻击手段。
2、OWASP(Open Web Application Aecurity Project)
定义:
致力于发现和解决不安全Web应用的根本问题。
8.6.4Web安全测试流程
测试先后顺序:
功能测试->自动化测试->安全测试->性能测试
8.7安全审计—安全测试必会
8.7.1自动化审计工具
随着安全测试的开展和深入,越来越多的公司开始采用安全测试的手段,由于测试人员的能力和时间等因素,更多的采取注入AppScan、WebInspect等安全审计工具。
安全审计工具的使用的确给安全测试的开展节省了大量的时间,但同时也带来了各种各样的问题。(一个错报一个漏报)
8.7.2AppScan在项目团队长的协作
①测试人员:开发人员在开发过程中可以使用AppScan或者专用插件,随时开发随时测试,最大化的保证个人开发程序的安全性。越早发现问题,解决问题的成本就越低,这为Web应用的安全提供了最为坚实的基础保障。
②测试人员:系统测试时测试人员用AppScan对应用做全面的测试,一旦发现问题,可以快速的生成defect,通过CQ集成可以实现defect电子化跟踪,再传递到开发人员手中,指导开发人员迅速解决问题。
③审核人员:这是系统上线前的安全质量关卡。任何系统上线都应该经过严格的上线测试,这也最大化的减少了上线后问题的出现,避免生产系统上线后给企业带来的巨额损失。
④上线后审计、监控人员:上线的系统应该定期检测,一旦出现问题更应该及时检测,越快速的定位发现问题,损失就会越小。
8.7.3AppScan扫描范围
8.7.4扫描原理—探测阶段
探测过程中,所采用的测试策略可以选择默认的或自定义的,可采用不同的测试策略,测试策略库是AppScan内置的,它可以定义为你想要的组合,去检测你最想检测的可能存在的安全隐患。
模仿一个用户对被访问的Web应用服务站点进行探测访问,通过发送请求对站点内的连接与表单域进行访问或填写,以获取相应的站点信息(Application Tree)。
AppScan分析器将会对自己发送的每一个请求后的相应做出判断,查找出任何可能潜在风险的地方,并针对这些可能会隐含风险的相应,确定将要自动化生成的测试用例。
探测阶段完成后,这些高危区域是否真的隐含着安全 缺陷或应做更好的改良,以及这些隐含的风险是处于什么程度的,是需要在测试执行完成后,才能最终得出决论。
8.7.4扫描原理—测试阶段
测试阶段后,AppScan已经分析出可能潜在安全风险的站点模型。
AppScan也已经知道需要生成多少的测试用例,以便检测这些区域的安全隐患。这个时候的工作,主要就是生成这些已经计划好的测试用例。
AppScan是通过测试策略库中相应安全隐患的检测规则而生成对应的足够全面而且复杂的测试输入。
8.7.4扫描原理—扫描阶段
扫描阶段,AppScan才是真正的工作起来,他将会把上个阶段的测试用例产生的服务请求陆续的发送出去。
然后再检测分析服务的响应结果,从而判断出该测试用例的输入,是否造成了安全隐患或安全问题。
然后再通过测试用例生成的策略,找出该安全问题的描述,以及该问题的解决方案,同时还报告相关参数的请求发送以及响应结果。
8.7.5AppScan工作过程
①探测:选择测试模板、输入入口URL、发现应用结构。
②分析:基于规则进行测试、实时产生测试结果。
③报告(详细的、可操作的指导信息):根据安全规范报表、根据业务规范报表。
创建新的扫描:
选择预定义模板:
选择执行的扫描类型:
输入起始URL:
录制登录:
启动扫描:
扫描结果查看:
8.8性能测试概述—加薪升职必会
8.8.1性能测试简介
为什么要进行性能测试?
多个客户端同时访问造成压力:Web应用服务器、应用服务器、数据库、网络。
8.8.2性能测试的概念
①软件系统的性能测试是一个很大的概念,覆盖面非常广泛:
对软件系统而言,包括执行效率、资源占用、系统稳定性、安全性、兼容性、可靠性、可扩展性等。
②性能测试是扫描测试对象与性能相关的特征并对其进行评价而实施和执行的一类测试:
主要通过自动化的测试工具模拟多种正常、峰值以及异常负载条件下来对系统的各项性能指标进行测试。
8.8.3性能测试介绍
性能测试通常包含一下方面的内容:
①评估生产准备状态。
②评估性能判定标准。
③比较多个不同系统或同意系统不同配置之间的性能特征。
④找出导致性能问题的源头。
⑤帮助进行系统性能调优。
⑥确定吞吐量水平。
8.8.4性能测试的核心活动
①确定测试环境:物理环境、生产环境、测试团队可利用的工具和资源。
②确定性能验收标准:确定响应时间、吞吐量、资料利用总目标和限制。
③计划和设计测试:确定关键场景;确定典型用户的可变性,以及如何模拟这些变化;确定测试数据;确定需要收集的度量值。
④配置测试环境:随着需要测试的功能和组件的完善,逐步为每个策略准备执行所需的测试环境、工具以及资源。
⑤实现测试设计:根据测试设计逐步开展性能测试。
⑥执行测试:执行和监控测试。
⑦分析结果、报告以及重复测试:整合并共享结果数据。
8.8.5性能测试目标
评估软件发布准备:
①预测或者估计应用软件在实际生产方面的特性特征,并且基于这些预测来评估是否需要强调性能因素。
②提供相关数据,反应用户可能会对系统性能特征产生哪些不满意。
③提供数据帮助预测,由于可伸缩原因和稳定性问题,或者由于用户不满意应用软件的相应时间所导致的收入损失或者品牌可信度降低。
8.8.6性能测试介绍
1、评估基础结构是否恰当:
①评估当前容量是否足够。
②确定稳定性的可接受范围。
③确定应用软件基础结构的容量。
④比较不同的系统配置,确定哪些配置可以在实际应用和商业需求之间达到最佳效果。
⑤确定应用软件在预计的资源使用限制范围内已经显示出来最佳性能特征。
2、评估已开发软件的性能是否满足要求:
①在对应软件进行修改以前和以后,都需要确定应用软件已经获得了满意的性能特征。
②提供应用软件当前所具有的性能特征与所能达到的最佳性能特征之间的比较。
3、提高性能调整效率:
①分析应用软件的各种不同负载水平下的运行状态。
②确定应用软件的瓶颈。
③在进行生产发布之前,提供与产品的运行速度、可伸缩性和稳定性相关的信息,这样可以使得相关利益方能够对是否或者何时调整系统作出更加明智的决定。
8.8.7性能测试的种类
性能测试是确定或者有效验证了系统或者应用软件在测试环境下的速度、可伸缩性以及(或者)稳定性等各种特性。
性能是指足以满足项目或者产品的性能目标的相应时间、吞吐量以及资源利用率。
性能测试是一个总体的概念,其他的性格相关的测试都是性能测试的子范畴
1、负载测试
①侧重于确定当前测试中的系统或者应用软件在工作负载条件下,或者在实际运行阶段加载预期的容量时,系统或者应用软件所具备的相关性能特性。
②通过逐步证据系统负载,测试系统性能的变化,并最终确定在满足性能指标下,系统所能够承受的最大负载量。
③ 负载测试是通过逐步加压的方式来确定系统的处理能力,确定系统能够承受的各项阀值。
2、压力测试
①确定当系统或者应用软件在某些超过实际运行阶段所预期的条件下时所具备的性能特性。
②通过逐步增加系统负载,测试系统性能的变化,并最终确定在什么负载条件下系统性能处于失效状态,并获得系统性能提供最大的服务基本。
③压力测试是逐步增加负载,使系统某些资源达到饱和甚至失效的测试。
3、容量测试
①在满足性能目标的前提下,系统能够最大处理的最大会话能力,确定系统可处理同时在线的最大用户数。
②容量测试确定了服务器的极限失效点,同时监控在各种不同负载和流量模式水平下的性能结果。
4、配置测试
通过对被测试软件的软硬件配置的测试,找到系统各项资源的最优分配原则。
5、并发测试
测试多个用户同时访问同一个应用、同一个模块或者数据记录时是否存在死锁或者其他性能问题,几乎所有的性能测试都会涉及到一些并发测试。
6、可靠性测试
通过给系统加载一定的业务压力的情况下,运行一段时间,检查系统是否稳定。通过可以测试出系统是否有内存泄露等问题。
7、稳定性测试
在复杂多变的环境下系统所能提供的总可靠性、健壮性、功能和数据完整性、有效性以及响应的连续性。
8.8.8核心性能测试活动
活动1:确定测试环境:
①确定物理环境、生产环境以及测试团队可利用的工具和资源。
②物理环境包括:硬件、软件以及网络配置。
③在测试开发时就对整个测试环境有一个全面的了解,可以使得测试设计和计划更加有效,并且有利于在项目初期就确定测试中的复杂问题。
活动2:确定性能测试验收标准:
①确定响应时间、吞吐量、资源利用中目标以及限制。
②一般来说,响应时间是用户关系的焦点,吞吐量是业务关系的焦点,资源利用则是系统关系的焦点。
③确定项目成功的标准,这个标准可能并不包含在上面所确定的总目标和限制之中;例如:利用性能测试来评估,怎样组合相关的配置才可以带来最佳性能特征。
活动3:计划和设计测试:
①确定关键场景。
②确定典型用户的可变性,以及如何模拟这种可变性。
③确定测试数据。
④将这些信息整合到一个或者多个系统使用情况模型中,以进行实现、执行和分析。
活动4:配置测试环境
①随着需要测试的功能和组件的完善,逐步为每个策略准备执行所需要的测试环境、工具以及资源。
②确保测试环境已经配置妥当,可以进行资源监控。
活动5 :实现测试设计
根据测试设计逐步展开性能测试
活动6:执行测试
①执行和监控测试。
②保证测试、测试数据以及结果收集有效。
③监控测试和测试环境,确保进行有效的测试以保障结果分析的正确性。
活动7:分析结果、报告以及重复测试
①整合并且共享结果数据,不仅要对单个数据进行分析,还要从一个功能交叉的测试团队角度来分析数据。
②如果所有度量都在可接受的范围内,没有违反任何预设阀值,并且收集到了所有需要的信息,就完成了基于特定配置的特定场下的测试。
8.9LoadRunner使用—必会的性能测试工具
8.9.1LoadRunner介绍
定义:
LoadRunner是mercury公司著名的性能测试产品。2006年被HP收购后,LoadRunner就已经成为HP重要的产品之一。
LoadRunner通过模拟一个多用户并行工作的环境来对应程序进行负载测试。通过使用最少的硬件资源,这些虚拟用户提供一致的、可重复并可度量的负载,像实际用户一样使用所要测试的应用程序。LoadRunner深入的报告和图提供了评估应用程序性能所需的信息。
LoadRunner是一种适用于各种体系架构的负载测试工具,它能预测系统行为并优化系统性能。LoadRunner的测试对象是整个企业的系统,它通过模拟实际用户的操作行为和实行实时性能监测,来帮助您更快地查找和发现问题。LoadRunner能支持广泛的协议和技术,为您的特殊环境提供特殊的解决方案。
8.9.2LoadRunner主要特点
①广泛支持业界标准协议。
②支持多种平台开发的脚本。
③创建真实的系统负载。
④强大的实时监控与数据采集功能。
⑤精确分析结果,定位问题所在。