按是否手工执行测试的角度划分:手工测试、自动化测试
1.手工测试(Manual testing)
手工测试是由人一个一个的输入用例,然后观察结果,和机器测试相对应,属于比较原始但是必须的一个步骤。
由专门的测试人员从用户视角来验证软件是否满足设计要求的行为。
更适用针对深度的测试和强调主观判断的测试
比如:众包测试和探索式测试
优点:自动化测试无法代替探索性测试、发散思维类无既定结果的测试。
缺点:执行效率慢,量大易错。
2.自动化测试(Automation Testing)
定义
所谓自动化测试,就是在预设条件下运行系统或应用程序,评估运行结果。(预先条件包括:正常条件和异常条件)。简单来说,自动化测试就是是把人为驱动的测试行为,转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较。在此过程中,为了节省人力、时间或硬件资源,提高测试效率,便引入了自动化测试的概念。
分类
自动化测试有:功能测试自动化、性能测试自动化、安全测试自动化。(一般情况下,我们说的自动化是指功能测试的自动化)
自动化测试按照测试对象来分,还可以分为接口测试、UI测试等。接口测试的ROI(产出投入比)要比UI测试高。
优点
缺点
适用范围
自动化测试可以涉及和试用的范围主要在以下方面:
基于Web UI的浏览器应用的界面测试
基于WebService或者WebAPI的服务契约测试
基于WCF、.net remoting、Spring等框架的服务的集成测试
基于APP UI的移动应用界面测试
基于Java、C#等编程文件进行的单元测试
前提条件
实施自动化测试之前需要对软件开发过程进行分析,以观察其是否适合使用自动化测试。通常需要同时满足以下条件:
1) 需求变动不频繁;
测试脚本的稳定性决定了自动化测试的维护成本。如果软件需求变动过于频繁,测试人员需要根据变动的需求来更新测试用例以及相关的测试脚本,而脚本的维护本身就是一个代码开发的过程,需要修改、调试,必要的时候还要修改自动化测试的框架,如果所花费的成本不低于利用其节省的测试成本,那么自动化测试便是失败的。项目中的某些模块相对稳定,而某些模块需求变动性很大。我们便可对相对稳定的模块进行自动化测试,而变动较大的仍是用手工测试。
2) 项目周期足够长;
自动化测试需求的确定、自动化测试框架的设计、测试脚本的编写与调试均需要相当长的时间来完成,这样的过程本身就是一个测试软件的开发过程,需要较长的时间来完成。如果项目的周期比较短,没有足够的时间去支持这样一个过程,那么自动化测试便成为笑谈。
3) 自动化测试脚本可重复使用
如果费尽心思开发了一套近乎完美的自动化测试脚本,但是脚本的重复使用率很低,致使其间所耗费的成本大于所创造的经济价值,自动化测试便成为了测试人员的练手之作,而并非是真正可产生效益的测试手段了。
另外,在手工测试无法完成,需要投入大量时间与人力时也需要考虑引入自动化测试。比如性能测试、配置测试、大数据量输入测试等。
适合场景
通常适合于软件测试自动化的场合:
(1)回归测试,重复单一的数据录入或是击键等测试操作造成了不必要的时间浪费和人力浪费;
(2)此外测试人员对程序的理解和对设计文档的验证通常也要借助于测试自动化工具;
(3)采用自动化测试工具有利于测试报告文档的生成和版本的连贯性;
(4)自动化工具能够确定测试用例的覆盖路径,确定测试用例集对程序逻辑流程和控制流程的覆盖。
注:自动化测试更适合用于回归测试,而不是用来发现新bug。
自动化测试的流程
测试计划:划定自动化测试的范围包含哪些需求,涉及到哪些测试过程
测试策略:确定自动化测试的工具、编程方案、代码管理、测试重点
测试设计:使用测试设计方法对被测试的需求进行设计,得出测试的测试点、用例思维导图等
测试实施:根据测试设计进行用例编写,并且将测试用例用编程的方式实现测试脚本
测试执行:执行测试用例,运行测试脚本,生成测试结果
自动化实施的步骤
(1)完成功能测试,版本基本稳定
(2)根据项目特性,选择适合项目的自动化工具,并搭建环境
(3)提取手工测试的测试用例转换为自动化测试的用例
(4)通过工具、代码实现自动化的构造输入、自动检测输出结果是否符合预期
(5)生成自动测试报告
(6)持续改进、脚本优化
自动化测试模型
可以分为线性测试、模块化与类库、数据驱动测试和关键字驱动测试。
线性测试通过录制或编写对应程序的操作步骤会产生相应的线性脚本,即单纯地模拟用户完整的操作场景。
模块化与类库式把重复的操作单独封装成公共模块,在测试用例执行过程中,当需要用到模块封装时对其进行调用,这样就最大限度地消除了重复,从而提高测试用例的可维护性。
数据驱动测试的定义:数据的改变驱动自动化测试的执行,最终引起测试结果的改变。就是把数据驱动所需要的测试数据参数化,我们可以用多种方式来存储和管理这些参数化的数据。
关键字驱动测试又被称为表驱动测试或基于动作字测试。这类框架会把自动化操作封装为“关键字”,避免测试人员直接接触代码,多以“填表格”的形式降低脚本的编写难度。
自动化测试框架
自动化测试架构思想做一个对比:
1)数据驱动测试:
其思想是将我们的自动化测试脚本和测试数据放在共同的测试架构中,提供可重用的测试逻辑。这样做的目的是减少测试维护的工作量以及便于改善测试用例的覆盖率。测试用例需要输入的测试数据和测试完成后的测试结果数据都会被存储在同一个数据库或者数据源中,并且将测试的数据和测试逻辑分开。这样测试数据发生了变化时不会影响到我们的测试逻辑,并且同一套测试逻辑可以针对多种数据来进行测试,尽量提高测试逻辑的使用效率和复用效率。
2)模块驱动测试:
其思想是使用独立的脚本或者代码来对应每一个待测试的模块单元和功能。模块驱动测试引入的是编程语言中的面向对象编程中的抽象和模块独立封装的思想,即将测试代码和每一个测试模块进行解耦,减低自动化测试脚本或者自动化测试代码的维护成本,同时增加可扩展性。
3)关键字驱动测试:
Robot Framework和RedwoodHQ就是一种典型的关键字驱动测试的框架模式。关键字驱动测试通常也被认为是表格驱动测试,通过在表格中调用关键字来实现自动化测试。这种设计思想一般会将自动化测试拆分为设计和实现两个不同的阶段。
4)行为驱动开发测试(BDD):
是一种敏捷开发的思想,使用简单的、特定于领域的脚本语言(DSL)将结构化自然语言语句转换为通俗易懂的可执行测试。行为驱动开发的根基是一种“通用语言”,通俗易懂,同时被客户和开发者用来定义系统的行为。Cucumber就是一种行为驱动开发的自动化测试工具。
自动化测试架构设计
注:ant也可以换成maven,看项目代码是不是用maven
分层自动化测试
上图更多关注产品的UI层自动化测试,而分层自动化测试倡导产品不同阶段(层次)都需要自动化测试:
unit :单元自动化测试,是对软件中最小的可测试单元进行检查与验证,如:C语言的最小的单元是一个元素,Java中最小的单元是一个类,图形化软件中的最小单元是一个窗口、按钮、菜单等。规范单元测试需要借助于单元测试框架(工具)
单元测试(Code Review :中译 代码评审、代码审查):查找系统缺陷、保证软件真题质量,提高开发者自身水平。
Service:接口自动化测试 分为:模块接口测试、web接口测试
模块接口测试:测试模块间的调用与返回。如:类方法、函数调用并对返回结果进行验证
Web接口测试:分为服务器接口测试、外部接口测试
服务器接口测试:浏览器与服务器之间的接口,通过HTTP协议进行调用
外部接口测试:调用接口,由第三方调用,如:调用微信、QQ、微博登陆接口
UI层:是用户使用该产品的入口,所有功能都通过这一层提供并展示给用户,所以测试工作大多集中在这一层进行。为了减轻这一层的测试人力和时间成本,早期的自动化测试工具主要针对该层设计。
除了UI层所展示的功能外,前端代码同样需要进行测试。在前端开发中最主要的是javascript脚本语言,而QUnit就是针对Javascript的一个强大的单元测试框架。
分层自动化测试投入比例
UI层自动化测试:投入比例小,原因:很难保证产品的质量,浪费人力、物力,因为越接近用户越容易变化
什么样的项目适合自动化测试
-任务测试明确,不会频繁变动。
-每日构建后的测试验证。
-比较频繁的回归测试。
-软件系统界面稳定,变动少。
-需要在多平台上运行的相同测试案例、组合遍历型的测试,大量的重复任务。
-软件维护周期长。
-项目进度压力不太大。
-被测软件系统开发较为规范,能够保证系统的可测试性。
-具备大量的自动化测试平台。
-测试人员具备较强的编程能力。
正常情况下满足三个:
1、软件需求变动不频繁: 自动化脚本变化的大小、频率决定自动化维护成本,变化大,测试人员要进行扩展、修改、调试
2、项目周期较长:需求确定,框架有好的设计,脚本开发调试时间较长
3、自动化测试脚本可重复使用:测试项目之间是否存在很强的差异性,如:c/s、b/s之间的架构所展示的功能差不多,对脚本可重复使用,选用的技术、工具是否适应这种差异,测试人员是否有能力设计出满足条件的差异
自动化测试及工具简述
自动化测试的概念有广义和狭义之分:广义上讲:所有借助工具来辅助进行软件测试的方式都可以称为自动化测试;狭义上讲:主要是指基于UI层的功能自动化测试。
1)UFT:(QTP:企业级自动化测试工具,提供强大、易用的录制回放功能,同时兼容对象和图像两种识别模式,支持B/S和C/S两种架构的软件测试 )
2)Robot Framework:基于Python语言编写的自动化测试框架,具备良好的可扩展性,支持关键字驱动,同时可测试多种类型的客户端或接口,可进行移动端测试
3)Watir:基于WEB测试,使用Roby语言开发
4)Selenium:用于web应用程序测试工具,支持多平台,多浏览器,多语言去实现自动化测试
下来我们探讨一下主流的自动化测试方案,无一例外,都有人机沟通的编程语言,加上机器操作的工具来组成。
功能自动化测试
VBScript + QTP(HP UFT),商用功能自动化测试方案
Python/PHP/Java/C#/JavaScprit/Ruby + Selenium/Appium + 单元测试框架,开源功能自动化测试方案
这里我们多介绍一点,Selenium/Appium 本身不能算是测试工具,而只是机器用来操作浏览器的工具,并且这个工具能听懂多种语言:
Java,C# 这两个重 (zhòng) 语言
Python,Ruby 这两个脚本轻语言
PHP,JavaScript 这两个专门处理 Web 的语言
工具外加指定的语言,可以让机器来操作浏览器,但是到此时还无法做到测试,于是才需要每个语言自己的单元测试框架,来一起完成这个功能自动化测试方案的构建。
此外,业界还一种暂时临时的方案,就是 Python 2 + Robot Framework + Selenium Library 插件 + 单元测试框架 构成的一种测试方案,这个方案笔者不是非常推荐,主要基于两点:
理念:这是一种基于关键字的方案,那么关键字是 QTP(HP UFT)的特长,并不是Selenium的本意
技术:Python 2 终究是要退出历史舞台的,如果从零开始做自动化测试,还是直接入手 Python 3 吧,然而 Robot Framework 不支持 Python 3……
Python/Java/C#/JavaScprit/Ruby + Gauge,又一款开源的功能自动化测试方案
Thoughtworks 的基于BDD理念的自动化测试工具
Gauge 本身就是完整的测试方案
Gauge 是从需求分析师(BA)到测试工程师(QA)都覆盖的测试方案
Java/Python + Macaca,阿里巴巴的功能自动化测试方案,缺点是文档少
JavaScript + TestCafe,DevExpress 的开源功能自动化测试方案
pure node.js - TestCafe不使用Selenium,并且不需要插件来在实际浏览器中运行测试。 它建立在node.js的顶部,因此它与现代开发工具集成和工作良好
无需额外的设置或配置- TestCafe是所有设置后立即运行测试npm install
完整的测试工具 - 使用单个启动命令,TestCafe启动浏览器,运行测试,收集结果并生成报告
JavaScript + Postman,免费的Web接口功能自动化测试方案
Groovy + SoapUI,开源的Web接口功能自动化测试方案
性能自动化测试
Java/C + HP LoadRunner,商业版性能测试方案
Java + JMeter,开源版性能测试方案
Python + locust,开源版性能测试方案
学习自动化测试技术心得
一、自动化测试的学习步骤
1. 做好手工测试(了解各种测试的知识)-> 2. 学习编程语言-> 3. 学习Web基础-> 4. 学习自动化测试工具 ->5. 学习自动化测试框架 -> 6. 实现自动化测试用例 -> 7. 开发自动化测试工具 ->8. 开发自动化测试框架
按照这个步骤来说,基本上到第7步,难度就比较大了,这个时候也可以称呼自己为“测试开发”。
二、自动化测试需要掌握的技术能力
一、首先要学会一门语言,java或者Python,这里针对Python去说。如果要能够满足自动化测试的需求,不要求Python的能力上来就达到精通的水平,但是最起码的使用是要有的,然后在后期在逐步根据测试工具进行进阶。
二、需要掌握前端的一些知识,无论学习语言还是前端知识,都是为了接下来的脚本和框架做铺垫。
三、数据库的重要性不言而喻,MySQL必须掌握
四、web端自动化测试工具selenium
五、接口测试自动化工具jmeter、postman等
六、移动端自动化测试appium
在这里主要就是把自动化划分为了web自动化测试、接口自动化和移动端自动化。
三、自动化测试的认识误区
1、自动化的软件测试与手工的软件测试过程一样
自动化测试所需要的技巧与手工测试所需要的技巧是不一样的。
通常,你的项目经理会被那些测试工具销售们迷惑,认为自动化的软件测试就是简单地按一个录制的按钮,产生测试脚本。而事实上并没有那么简单。
区分自动化测试所需要的技巧与手工测试所需要的技巧是非常重要的。最重要的是,自动化测试工程师需要掌握软件开发技巧,没有接受任何培训的手工测试人员,或者没有编程背景的手工测试人员,在实施自动化测试时会碰到很多困难。
2、自动化测试一定会马上大量减少测试人员数量
自动化测试不会马上大量减少测试人员数量。因为开展自动化测试初期需要投入一定的人力进行自动化测试脚本开发,并逐渐将自动化测试脚本用于日常的测试中,逐步减少手工测试人员从事重复劳动的时间和人数。为了缩短自动化测试脚本的开发时间,可以考虑将自动化测试脚本的开发工作借助外包的力量来早日实现大规模的自动化测试。
3、测试自动化就是录制和回放
仅仅录制得到的不是有效的自动化脚本。
很多项目经理仍然把测试自动化等同于使用录制回放工具。而事实上,录制得到的脚本通常是不可重用的脚本,脚本中充满了硬编码的值,这些值应该被参数化,否则脚本仅仅适用于一个测试情况,脚本还应该加入条件判断、循环等结构,以便增强测试脚本的灵活性。
4、自动化测试找不到bug
自动化测试不直接找bug,而是通过解放有经验的测试工程师的生产力,让其从重复的回归测试中解放出来,从事新的测试方法和测试手段的研究。通过自动化测试解放出测试人员的时间和精力来间接地找到更多、更深层次的新bug,将产品质量再提高一个档次。
5、自动化测试工具是“万能”的
很多人一听到自动化测试,就认为自动化测试工具可以完成一切测试工作,从测试计划到测试执行再到测试结果分析,都不需要任何人工干预。显然,这是一种理想状态,现实中还没有哪个测试工具有这个能力,并且将来也不会有。在现实中有关的测试设计、测试案例,以及一些关键的测试任务还是需要人工参与的,即自动化测试是对手工测试的辅助和补充,它永远也不可能完全取代手工测试。
6、自动化测试工具容易使用
对于这一点,很多测试工程师有同样的错误观点,认为测试工具可以简单地通过捕获(录制)客户端操作生成脚本,且脚本不加编辑就可用于回放使用。事实上,自动化测试不是那么简单的,捕获的操作是否正确,以及脚本编辑是否合理都会影响测试结果。因此,自动化测试需要更多的技能,也需要更多的培训。
7、自动化能提供百分百的测试覆盖率
并非所有内容都可以被自动化地测试到。不可能覆盖所有可能的输入,所有可能的组合和路径。
自动化测试可以增加测试的广度和深度,但是仍然无法达到100%的测试覆盖率,因为没有足够的时间或资源。
8、忘记了测试的最终目标:找到BUG
在自动化测试中,同样要注意把边界值分析、等价类分析、基于风险的测试方法、挑选最合适的测试用例等技术应用起来。
通常在自动化测试过程中,我们都忙着搭建自动化框架和编写测试脚本,但是我们往往忘记了测试的本来目的:找bug。
项目经理可能雇佣了最好的自动化开发人员来搭建框架,使用了最新最好的自动化开发技术,创建了成千上万的自动化测试脚本。但是如果BUG仍然被遗漏了,那些本该被自动化测试脚本捕捉到的BUG,结果没有被捕捉到,那么你的自动化测试仍然会被认为是失败的。
9、所有测试用例都可以自动化
不是所有的测试用例和测试步骤都可以转化为自动化测试。在自动化测试投入较多的行业,领先企业的自动化测试率有的能达到80%左右,但仍有20%左右的测试用例需要手工来进行。在国外,通常从开发第一版测试用例时,就同步进行自动化测试脚本的开发,所以自动化测试率普遍比中国企业高。
10、只有性能测试才需要自动化
自动化测试不光进行性能测试,更被大量应用于功能测试验证,在国外超过半数的自动化测试脚本都是用于功能验证测试的。
11、测试工具可适用于所有的测试
每种自动化测试工具都有它的应用范围和可用对象,所以不能认为一种自动化测试工具能够满足所有测试的需求。针对不同的测试目的和测试对象,应该选择合适的测试工具来对它进行测试。在很多情况下,需要利用多种测试工具或者开发自动化测试框架才能达到自动化测试的目的。商业和开源的测试工具能够用来进行自动化测试,但是我们需要根据自身产品的特点,开发自动化测试框架,在框架中提供常用的测试用例,加快测试速度,达到测试用例复用,这是今后测试自动化发展的道路。
12、自动化测试能发现大量新缺陷
发现更多的新缺陷应该是手工测试的主要目的,不能期望自动化测试去发现更多新缺陷。事实上,自动化测试主要用于发现原来的缺陷。自动化测试用于回归测试,而大量的新业务测试更多地还是依赖手工测试。
除了以上列举的常见误区外,还有其他不同的认识误区。自动化测试认识误区的产生,归根到底最本质的原因是由于对自动化测试不现实的期望,也就是期望过高造成的。
3.手工测试和自动化测试的区别
自动化测试脚本执行流程图: