对于自动化测试,原来谈这方面的内容比较少,但是现在我们做DevOps支撑平台的时候,在整个持续集成和交付的过程中,有一个重要的内容就是自动化测试。自动化测试的覆盖面相当大,其中既包括了CS,BS和移动APP的自动化测试分类;也包括了单元测试,接口自动化测试和UI自动化测试的分类。
DevOps成熟度中测试管理概述
测试管理是一个过程,通过该过程,所有和测试相关的方法,流程,人员都被定义。在产品投入到生产环境运行之前,通过测试过程验证产品的需求,尽可能地发现软件中的缺陷,从而提高软件产品的质量。测试管理分为测试分层策略,代码质量管理和自动化测试三个维度进行表达。
测试分层策略
先谈下有哪些测试分类的方法,在持续集成里面我们当然更加会强调自动化测试,因此可以理解为人工测试和自动化测试两类;也可以离开为代码级测试,接口测试和前端测试分离。也可以理解为功能测试和非功能测试两类。
当然也可以看到,在微服务架构下,我们希望我们本身的开发也是分层的,即中台模块+服务接口+前台功能,即我们通常说的前后端分离,在这种前后端分离的情况下,可以更加方便我们进行测试分层设计和自动化测试。只要是厚中台+薄前台模式,那么就越容易实现测试过程的自动化。
越是持续集成自动化承担越高,那么自动化测试的比重就会越大。
可以看到首先在架构设计上就要做到前后端分离,中台+服务+前台,这种分离后可以更加方便后面进行后端代码和接口的自动化测试工作。
可以看到在测试分层策略里面的四到五级描述里面,我们看到TDD测试驱动开发方面的内容,比如先写测试代码再写实现代码或者两者同时在进行等。其次,我们还是要将在整个devops最佳实践里面,不仅仅开发过程是持续增量进行的,对于测试过程本身也是持续增量进行的,两者必须匹配。
或者理想状态应该是没有独立的测试周期,开发完成的阶段往往就是测试也配套完成的时间点。
代码质量管理
是软件研发过程中保证代码质量的一种机制,即在代码变更后,需要对代码进行检查,分析,并给出结论和改进建议,对代码质量数据进行管理,并可以对代码质量进行追溯。主要包括了质量规约,检查方式,反馈处理三方面的内容。
代码质量管理即我们常说的代码静态检查,其基于我们制定的代码质量规约进行。质量规约是指对软件代码质量的要求和规范,其中包含了编码规范,复杂度,覆盖率,以及安全漏洞,合规性要求等多个方面的内容。其中检查方式即包括了我们传统手工方面的检查和CodeReview,也包括了运行相关的自动化检查工具进行检查。
自动化测试
自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程,在预设条件下运行系统或应用程序,执行测试并评估测试结果,以达到节省资源和人力,提高测试效率和准确性,主要包括了自动化设计,自动化开发,自动化执行和自动化分析。
对于自动化测试可以看到,对于服务接口和代码级的自动化测试相对来说比较容易实现,但是对于前端和UI级的自动化测试相对来说就比较困难些。因此对于前期实践,我们也是建议先实现接口服务和代码级的自动化测试,再来靠前端UI的自动化测试。
对于性能测试由于可以提前录制脚本,相对来说自动化测试实现起来比较容易。不论是那种类型的自动化测试都可以看到,实际上可以看到如下几个关键点。
- 自动化测试代码或脚本的编写,可以是人工编写,也可以通过录制生成。
- 测试数据的产生问题,参考测试管理过程域
- 自动化测试脚本能够重复执行的要求,确保每次持续集成都能够重复运行测试脚本
到了自动化测试的第四级开始,可以看到增加了对独立的自动化测试平台的要求,同时也增加了对测试结果分析和度量的要求,即通过测试结果的度量分析来进一步改进测试效率,提升代码质量。
自动化测试概述
今天只谈下对于常见的一个Web应用的自动化测试应该如何去考虑。
要知道自动化测试不是一个新鲜的东西,很早就有,只是最近几年有了新的发展。比如在10多年前我们做每日构建和冒烟测试,持续集成的过程中,我们就已经在用Junit做自动化测试,并集成到整个持续集成过程。在每日构建完成后,自动化运行Junit的自动化测试脚本并输出冒烟测试的测试结果报告。
而在当时如果涉及到CS应用的自动化测试,包括对于Web类应用的自动化测试,我们采用QTP(现在改名为UFT)工具来做自动化测试,但是并没有得到广泛的应用,一个核心的原因就是QTP来做Web端的自动化测试,实际上脚本录制和代码编写量都很大,而且很难对所有的测试用例做到完全覆盖,同时即使用了QTP工具录制和维护脚本,实际的人工测试还是不能省略,因此这些都导致了QTP自动化测试并没有大范围推广。
而最近几年的发展可以看到,对于Web自动化测试Selenium和Robot Framework逐渐成为了主流的自动化测试框架和选择。同时在微服务架构,前后端分层开发推广下,对于接口的自动化测试也发展很快。
UFT/QTP自动化测试工具
QTP是Quick Test Professional的简称,是一种自动测试工具。当前已经更名为UFT,即统一功能测试框架。使用QTP的目的是想用它来执行重复的自动化测试,主要是用于回归测试和测试同一软件的新版本。因此你在测试前要考虑好如何对应用程序进行测试,例如要测试哪些功能、操作步骤、输入数据和期望的输出数据等。
HP QuickTest Professional 提供符合所有主要应用软件环境的功能测试和回归测试的自动化。采用关键字驱动的理念以简化测试用例的创建和维护。它让用户可以直接录制屏幕上的操作流程,自动生成功能测试或者回归测试用例。专业的测试者也可以通过提供的内置脚本和调试环境来取得对测试和对象属性的完全控制。
以QTP为核心的自动化测试框架优点在于:适用性好,很多人都已经会用或者至少说可以简单应用,脚本也简单易懂,大多数无任何代码基础的测试人员都可以加入脚本录制和调试。然而它最大的缺点就是对象库,关键字的框架,灵活度也不高,且加上QTP在对flex等的支持上,也是让许多人头疼的问题。
在原来对于编码能力往往测试工程师都比较弱,因此对于QTP这种可以自动录制,自动执行和输出报告完整工具应用相当广泛。而现在的自动化测试技术栈,不管是接口、web、移动端,绝大多数都是基于开源项目来构建,测试人员本身的编码能力也在加强,特别是类似Python等脚本语言的大量使用,因此现在实际还在采用类似QTP商用工具的已经越来越少。自动化测试更多的采用类似Selenium, Robot Framework等开源工具进行集成。
Selenium自动化测试工具
Selenium是一个用于Web应用程序测试的工具。
这个工具的主要功能包括:测试与浏览器的兼容性,测试你的应用程序,看是否能够很好得工作,在不同浏览器和操作系统之上。测试系统功能,创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。
Selenium当前免费,而且可以和Jenkins,Maven,TestNG等实现集成,同时支持多语言,多平台和浏览器。因此当前被使用的相当多。
Selenium框架底层使用JavaScript模拟真实用户对浏览器进行操作。测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。
对于Selenium,里面有一个核心组件即Browser bot,类似于浏览机器人,可以执行从测试脚本接收到的命令,自动化的完成页面浏览和各种操作,并记录相应的测试结果。
Selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(SeleniuBm Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。Selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器。
具体可参考:
https://selenium.dev/
http://www.selenium.org.cn/ (中文站点)
Robot Framework
Robot Framework是一个跨平台的通用的,与应用程序和技术无关的测试框架。它的优点是:易于扩展,提供了简单的API,用户可以自定义基于Python和Java的测试库。它还提供强大的标签功能,来归类测试运行,在测试运行时可以选择不同的Tag或tag组合进行测试运行。
支持报告合并,以便让你可以多机执行,然后合并报告,全局测试超时时间设置,局部可以覆盖全局的设置非常方便,不会测试卡壳的等等。其主要优点包括:
- 通过使用关键字驱动测试(KDT)方法简化了自动化测试过程。
- 测试数据语法简单易用。
- 生态系统丰富。由各种通用测试库和工具组成,这些工具都是作为独立项目开发的。
- 具有高度可扩展性。
要注意到Robot Framework本身是关键字驱动的测试,库和关键字就很重要,对于当前的库和关键字没有的时候你还需要自己写代码进行扩展。
在Robotframework当中,由SeleniumLibrary(非robot自带,需要安装)库提供对网页的操作关键字(功能)。即Robot Framework+SeleniumLibrary结合基本就能够完成我们需要的Web和UI自动化测试能力。
具体可参考:
http://robotframework.org/
https://blog.csdn.net/qq_27534003/article/details/87437195
https://www.jianshu.com/p/2ebea3256e21
接口自动化测试
对于接口自动化测试,主要是指类似SOAP , Http Rest等接口服务如何进行自动化测试。实际上在我们SOA管控平台的开发过程中,我们也定制化开发了接口自动化测试的工具,先是人工运行一篇接口测试,这本身类似一个脚本录制的动作,然后后续再根据已经录制的脚本批量自动化运行接口测试脚本并输出结果。
Python+Request
Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库。它⽐ urllib 更加⽅便,可以节约我们⼤量的⼯作,完全满⾜HTTP测试需求。整个测试思路基本如下:
- 对于每个Http接口请求手工编写测试脚本
- 把对同一个接口的所有测试用例py脚本封装为方法,每个接口封装一个接口类
- 使用Testsuite调用这些接口类,构建测试集,或利用unittest自动识别测试用例
- 构建自动化测试
- 输出测试结果报告
可以看到要使用Python+Request一方面是要熟悉Python语言和Request库,一方面是需要手工编写测试脚本,整个代码编写量仍然很大。这个方法跟采用Junit单元测试基本是差不多的。
参考:
https://www.cnblogs.com/ailiailan/p/8535293.html
https://blog.csdn.net/songlh1234/article/details/84317617
Postman
Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。
Postman最早是作用chrome浏览器插件存在的,2018年初Chrome停止对Chrome应用程序的支持。当前Postman提供了独立的安装包,不再依赖于Chrome浏览器了。同时支持MAC、Windows和Linux。
具体参考和下载:
https://learning.getpostman.com/docs/
https://www.postman.com/downloads/
JMeter
开源测试工具Jmeter可以承担接口请求、结果解析和断言的工作,可以作为轻量级接口自动化的实现手段,对于开发能力不强或规模不大的团队也能接受。Jmeter可以在协议层实现基本的功能,包括接口访问、参数化构造、返回值断言和数据库访问,基本足够满足一个轻量级的接口自动化框架的功能。
注意Jmeter不仅仅是用做接口自动化测试,同时更加重要的一个功能是做接口的性能测试,我们在录制完成Http请求脚本后,可以对脚本的线程数,运行时长,循环数等进行配置并执行,执行完成后会输出详细的性能测试报告。
具体参考:
https://www.cnblogs.com/rd-ddddd/p/9578242.html
基于Java+TestNG+Rest Assured进行自动化测试
可以看到TestNG和Rest Assured是两个用于自动化测试的独立类库,这种方法偏白盒测试,需要自己编写测试代码,但是灵活性却相当高,同时可以和类似Jekins工具集合,当然也就可以和我们DevOps平台集成。
Rest-Assured 是一个测试Restful Web Service的Java类库,我们可以创建高度定制的HTTP请求以发送到Restful服务器。这使我们能够测试各种各样的请求组合,依次测试核心业务逻辑的不同组合。Rest-Assured库提供了验证从服器收到的HTTP响应的功能。
例如我们可以验证状态码,状态信息,标题甚至是响应的正文。这使Rest-Assured成为一个非常灵活,可用于测试的Java库。
而TestNG是一个开源自动化测试框架,实际上可以看到是和Junit差不多的一个自动化测试框架,只是增加了一些新的功能和更强大的集成能力。其优势是支持依赖测试方法,并行测试,负载测试,局部故障;灵活的插件API;支持多线程测试。
同时TestNG不仅仅可以测试Rest接口,也可以测试标准的Java API接口方法。
具体可参考:
https://www.cnblogs.com/wade-xu/p/4229805.html
注:上面这篇文章可以看到采用TestNG实现接口自动化测试,同时进行扩展,将测试脚本管理和测试数据管理分离。同时测试数据全部体现在Excel中。从Excel中读入测试输入,同时将测试接口输出到Excel中。
https://my.oschina.net/u/4112294/blog/3037471
注:上面这篇文章谈到TestNG和Rest Assured相结合如何进行接口自动化测试,同时如何和Jekins持续集成工具集成,将测试结果报告进行输出。
Rest Assured 自带支持对JSON、xml的解析,同时也提供了类似hasITems ,is,equalTo等静态方法供使用。尽管Rest Assured 提供了校验方法,但是在实际API自动化测试过程中,因为往往需要校验的字段非常多,建议还是直接先把要校验的JSON字段解析出来,再通过TestNG提供的Assert类进行校验。
对于Rest Assured的参考网站如下:
http://rest-assured.io/
https://github.com/rest-assured/rest-assured
LuckyFrame开源测试平台
LuckyFrame测试平台是一款免费开源的测试平台,最大的特点是全纬度覆盖了接口自动化、WEB UI自动化、APP自动化,并且支持分布式测试。既然是一个完整的测试平台,那么自然会提供测试用例管理,测试数据管理,测试执行,质量管理,测试结果和测试报告查看等相关的功能。这个平台提供在线的Demo可以查看。
LuckyFrame自动化测试框架分为两个项目:
一个服务端项目(LuckyFrameWeb),一个客户端项目(LuckyFrameClient),服务端项目主要负责自动化过程的管理,比如用例管理、测试任务管理等等。客户端其实就是测试执行机,主要负责测试用例以及任务的执行。
Web项目主要分为系统管理、UTP、 质量管理、测试工具测试环境管理等模块。
具体演示地址:
http://www.luckyframe.cn/page/lfdemo.html
https://gitee.com/seagull1985/LuckyFrameWeb
这个平台感觉有些思路还是可以借鉴,在前面DevOps整个子系统划分的文章里面我也谈到,对于测试管理既可以是一个简单的模块放在DevOps支撑平台里面,也可以是一个独立的子系统,然后再实现和DevOps支撑平台的集成。
可以看到整个工具还是基本按照一个完整的测试管理平台来实现,覆盖了测试计划,测试设计,测试执行,测试报告等多个方面的内容。同时支持Web UI自动化测试,API接口自动化测试,整体框架相当也完整,但是相关诸多细节估计还需要不断迭代完善。
Http Runner自动化测试框架
HttpRunner 是一个基于 Python 开发的测试框架,2018年python开发者大会上,了解到HttpRuuner开源自动化测试框架,采用YAML/JSON格式管理用例,能录制和转换生成用例功能,充分做到用例与测试代码分离,相比excel维护测试场景数据更加简洁。
HttpRunner 是一款面向 HTTP(S) 协议的通用开源测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。
为了简化测试用例的编写工作,HttpRunner 实现了测试用例生成的功能,对应的转换工具为一个独立的项目:har2case。即通过当前主流的抓包工具将抓取到的数据包导出为HAR,然后再将HAR格式转化为YAML/JSON格式的测试用例文件。
对于HTTPrunner当前已经到2.0版本,但是整体感觉还不是一个完整的自动化测试框架平台,当前对于HTTPrunner可以应用于一些简单的接口测试,或者是不会有大改动的接口的回归测试,这样也挺方便的。但是对于一些复杂的测试不如采用Rest Assured功能强和灵活,毕竟Rest Assured基于Java,可以灵活进行Java代码脚本的扩展。
具体参考:
https://v1.httprunner.org/