neo4j browser执行脚本后不提示用时_还不懂什么是分层自动化测试的,有赞的实践经历告诉你...

1641aec4d57eacb886e5562a7aef8ef1.gif

来源:https://testerhome.com/articles/19109

#  背景

先理一下自动化测试的概念,从广义上来说,一切通过工具(程序)的方式来代替或者辅助手工测试的行为都可以成为自动化。从狭义上来说,通过编写脚本的方式,模拟手工测试的过程,从而替代人工对系统的功能进行验证。

有赞是一家互联网行业的创业公司,测试起步较晚,发布非常频繁,就算每次只回归核心功能,对人数极少的几个测试人员来说工作量巨大,且基本是重复劳动,极其枯燥,持续时间长了也容易出错。

所以初期我们测试自动化切入的思路非常简单:从实际用户的角度出发,模拟真实的操作,替代现有的手工测试用例的执行。这样一来,每次重复的工作就可以用自动化来替代,测试人员只需要关注每次发布的增量需求即可。

随着脚本数量的增加,这种自动化覆盖的方式的弊端也逐渐暴露:

  • 执行效率低下

  • 构建成功率低(误报率高)。

  • 受前端样式变更影响大

  • 外部依赖较多,不是所有用例都能自动化

  • 覆盖能力有限

虽然我们在测试框架和工具层面通过结合 selenium-grid 实现了脚本并发执行和失败用例重试机制以提高执行效率和降低误报率,但是这种方式只能缓解问题,并不能从根本解决覆盖不全的问题。

正好赶上公司的 SOA 服务化进程,测试这边也开始配合的做自动化方面的转变,从原来的黑盒系统级自动化测试向分层自动化测试转变。

# 分层自动化测试

在谈分层测试之前,先回顾几个概念:

单元测试:对软件中的最小可测试单元进行检查和验证。

具体的说就是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。

集成测试:集成测试是在单元测试的基础上,测试在将所有的软件单元按照概要设计规格说明的要求组装成模块、子系统或系统的过程中各部分工作是否达到或实现相应技术指标及要求的活动。

也就是说,在集成测试之前,单元测试应该已经完成。这一点很重要,因为如果不经过单元测试,那么集成测试的效果将会受到很大影响,并且会大幅增加软件单元代码纠错的代价。

系统测试:将需测试的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其他系统元素及环境结合在一起测试。

系统测试的目的在于通过与系统的需求定义作比较,发现软件与系统定义不符合或与之矛盾的地方。

接下来我们谈谈有赞是如何随着系统拆分 SOA 服务化推进分层自动化测试的。在经典的测试金字塔中:

c175c56e80f0e32089f0015047ead479.png

其中 Unit 代表单元测试,Service 代表服务集成测试,UI 代表页面级的系统测试。分层的自动化测试倡导产品的不同层次都需要自动化测试,这个金字塔也正表示不同层次需要投入的精力和工作量。

下面逐层介绍有赞的分层自动化实践。

1、Unit-单元测试

在系统拆分之前,有赞只有一个庞大的巨无霸系统,单元测试极度缺失。在系统逐渐SOA服务化的过程中,我们逐渐提出了对单元测试覆盖率的要求。

我们的单元测试会分别做DAO层和服务层的测试。DAO层的单元测试主要保障SQL脚本的正确性,在做服务层的单元测试时就可以以DAO层是正确的前提进行用例编写了。

为了做细粒度的测试,需要解决单元测试的外部依赖。系统和模块之间的依赖可以通过Mock框架(Mockito/EasyMock)解耦,同时可以结合h2database解决对数据库的依赖,使得测试用例尽可能做到可以随时随地运行。

这一层发现并解决问题付出的成本相对来说最低,自动化用例的维护成本也不高,总的来说自动化测试的投入产出比最高。

单元测试的责任主体一般来说是开发人员,写单元测试也是开发人员对自己的代码进行检查的一个过程。

2、Service-服务集成测试

我们在服务层的测试首要考虑的是各系统(子系统)的集成测试。因为在经过单元测试这一层的保障之后,在服务层我们更关注的是某个系统的输入输出功能是否正确,以及若干个系统间的交互是否和业务场景的要求一致。

先来看看我们系统拆分之后的SOA系统应用架构图:

c910235721fbdfea0b965d88af6a096b.png

展现层:老的 Iron 应用,代码为 php。拆分之后 Iron 只剩下和前端交互的展现层逻辑,以及调用核心业务的 API层。

核心业务:Iron 系统拆分出来的核心业务。

这一层的被测对象是抽离了展现层的代码(前端以及部分后端展现层逻辑)。

鉴于有赞的测试起步较晚(应该很多创业公司都有类似情况),测试资源紧缺,代码覆盖率低得可怜。所以我们的初期自动化用例覆盖策略是这样的:

  • 从老的 Iron 应用的 API 接口作为业务场景覆盖的切入点

  • 优先覆盖核心业务的场景

  • 配合系统拆分,优先覆盖拆分出去的系统

  • 已拆分出去的系统,做好系统服务层的测试覆盖(全面覆盖该服务的接口)

  • 测试依赖的数据准备优先选择调用系统接口的方式(为了增加业务覆盖面)

  • 测试方式逐渐从黑盒向灰盒/白盒转变

这样做的好处是,可以快速增加业务场景的覆盖面,同时事先准备好的 API 接口用例,可以作为系统拆分后的冒烟测试用例,起到核心老功能的回归作用(只是做系统拆分,业务逻辑以及对展现层暴露的接口行为不变)。

毕竟在自动化测试的过程中,最怕的就是变化,会带来更多的脚本维护工作,而以这种方式覆盖的用例,目前来看维护成本很低。

再介绍一下这一层的初期我们用例的基本形态:

  • 专注于业务场景,和 UI 脚本一致,只是脚本从操作页面变成了调用接口。相对于 UI 自动化,服务层的接口测试更加稳定,测试用例也更容易维护。服务层接口测试可以更关注与系统整体的逻辑(业务)验证,而 UI 自动化则会转变为页面展示逻辑及界面前端与服务的集成验证(这个在 UI 层会介绍)。

  • 暂时不做系统间的 Mock。更多的考虑系统之间的耦合和依赖。

  • 搭建 MockServer 解决系统的外部依赖,主要是类似于支付等第三方系统(关于我们的 MockServer 会有专门的文章介绍)。

结合我们的交易系统举个例子:比如交易系统会依赖于商品和营销活动,那我们的下单场景的用例会依次调用商品和营销这几个系统的 API 构造数据作为用例的前置条件,然后按照下单的业务场景调用交易系统的下单接口,校验返回值以及写入 DB 的数据,最后做好数据清理的工作。

我们在这一层的测试框架选择是基于公司通用的服务框架(Nova)基础之上搭建的,架构图如下:

348ce899317b952fc89032a08ebdf0e2.png

  • BIT :服务接口集成测试(Business Interface&Integration Test)

  • SUT:被测系统(System Under Test)

  • Validator:各个业务的数据库结果验证封装

  • Mock:用例前置条件依赖的数据Mock服务

  • HttpClient:根据IRON系统的接口封装了返回通用的RPCResult对象

  • Util:常用工具类封装

  • Biz:在此封装了所有被测系统对外暴露的接口,供测试用例直接调用

  • TestCase:我们服务接口测试又分为SDV(System design Verify-系统设计验证)和SIT(System Integration Test-系统集成测试)。按照上面提到的用例覆盖策略,我们是在系统拆分之前,先根据该系统的业务场景和REST接口补充核心的接口集成测试用例,后续可以作为系统拆分之后的冒烟用例。在系统拆分之后,详细补充该系统的测试用例,粒度更细。

  • Facade:结合了Nova框架,对外发布各个业务的数据构造的REST接口,同时可以作为测试数据构造系统,辅助测试人员的手工测试。

这一层的测试覆盖主要是由测试人员进行,是测试人员大展身手的地方。

我们不需要非常详细的了解代码的实现,但是我们的用例里充分体现了我们对系统的结构,模块之间关系等的充分的理解。

后续我们对于 Service 层自动化测试的推进策略是:

  • 逐渐丰富 SDV 层的测试用例,并且在一定程度上进行用例依赖的系统的解耦,比如数据构造从调用接口向直接往数据库写入数据转变。

  • 逐渐细化拆分业务场景,做好用例的解耦。

  • 优先做场景覆盖,之后再考虑代码覆盖。

3、UI-展现测试

先提一个问题,既然在文章开篇提到了 UI 自动化测试有这么多弊端,这么劳民伤财,那么是否还有必要进行 UI 层的自动化呢?

答案是肯定的,因为 UI 层是产品最终呈现给用户的东西。所以在做好上面两层的测试覆盖之后,测试人员可以投入更多的精力到 UI 层的测试上。正是因为测试人员会在 UI 层投入较大精力,还是有必要通过自动化来帮助解放部分重复劳动力。

根据我们的 UI 层自动化实践,提一下 UI 层自动化覆盖的原则:

  • 能在底层做自动化覆盖,就尽量不在 UI 层做自动化覆盖

  • 只做最核心的功能的自动化覆盖,脚本可维护性尽可能提高

提高 UI 脚本可维护性的方法是遵循 Page Object 设计模式。

Page Object

Page Object 模式是为了避免在测试代码中直接操作 HTML 元素,对 Web 页面的抽象。好处有:

  • 减少测试代码的冗余

  • 提高测试代码的可读性和稳定性

  • 提高测试代码的可维护性

一个简单的例子

以有赞首页的登录操作为例(Ruby):

class LoginPage  include HeaderNav  def login(account, password)    text_account.wait_until_present.set(account)    text_password.set(password)    button_login.wait_until_present.click    return MainPage.new(@browser)  end  private  def text_account    @browser.text_field(:name => 'account')  end  def text_password    @browser.text_field(:name => 'password')  end  def button_login    @browser.button(:class => 'login-btn')  endend123456789101112131415161718192021
  • public 方法对外暴露页面的服务,对于登录页面来说就是登录行为

  • 页面的 UI 细节设为 private 方法对外隐藏

  • 跳转到新的页面后在此方法中 return 之后的页面的对象,比如登录之后跳转到首页(MainPage)。甚至同一页面也可以返回 self 做链式操作。

  • 各个页面的公共部分,如页面顶部导航,可以封装成 Module 供各个页面对象直接 include

下面我们来看看测试用例:

class TestLogin < Test::Unit::TestCase  def testLogin    @browser = Browser.new    @browser.goto 'youzan.com'    main_page = @browser.login_page.login('xx', '123')    #断言  endend12345678

这样最终的测试脚本呈现的就是单纯的页面操作逻辑,更贴近文本测试用例。

下面来看一下我们的测试框架:

c03bd981ee11b4ac0e35d1406bbd740d.png

  • Base:这一层和大多数 UI 测试框架大同小异,使用的是 selenium 和 watir,用例管理方面并没有使用 Ruby 领域炙手可热的 BDD 框架 cucumber,而是最基本的单元测试框架 MiniTest。同时还引入了 ruby 的多线程包,配合 UI 脚本的并发执行。

  • Actir:我们自己封装的测试框架。

  • Initializer:自动按照约定的工程结构加载所有的 ruby 文件,并根据 Page 的类名和反射自动生成了所有页面类的对象实例。

  • UA:封装好测试需要的浏览器U ser-Agent。

  • Executor:用例执行器。基于 ruby 的多线程包以及 selenium-grid,实现了所有用例的调度及分布式执行,可以一定程度上大大提升 UI 脚本的执行效率。执行器还包括了失败用例重试机制。

  • Util:工具类,包括了配置文件读写、数据驱动等。

  • Report:根据 UI 测试脚本执行的最终结果(失败重试的用例以最终的结果为准)自动生成 HTML 格式的测试报告。

  • Cli:根据 Actir 框架的上述功能,封装出的命令行工具,方便持续集成。

Project

  • Pages:基于 PageObject 模式包装出的页面的对象

  • Components:各个页面的公用的部分或者插件,如图片上传、地址选择等。包装成 Module 供各个页面对象需要时直接include。

  • Item:根据系统业务抽象出的对象,如订单、优惠券、商品等

  • User:根据系统业务抽象出的角色及其Action,如买家的购买行为、买家的退款、发货等。

随着服务层自动化覆盖率越来越高,UI层的自动化覆盖会逐渐转变为页面展示逻辑及界面前端与服务的展现层交互的集成验证。我们后续对于UI层自动化的演进规划是这样的:

  • 依赖环境的 Mock,解除UI脚本的外部依赖

  • 完善的数据准备,可以通过后端服务接口的 mock 使 UI 自动化更关注页面业务逻辑的自动校验。

  • 页面截图比对校验 UI 样式。

UI 层的自动化测试也是由测试人员负责,在覆盖了核心业务核心场景之后,不应该在这层的自动化覆盖上投入太多的精力和资源。

就算我们在一定程度上提高了脚本的可维护性,可是毕竟自动化测试最怕的就是变化,而UI界面是变化频率最高的一层,所以还是得投入一定的精力维护,不是么?

# 持续集成

有了上述各层的自动化测试脚本,下面我们需要建立起持续集成体系。持续集成的目的:

  • 流程自动化,提高工作效率

  • 最大化自动化测试脚本的价值

88737d8b7e03208209ed061742fa0539.png

我们的持续集成是基于 Jenkins 搭建的,主要的动作如下:

  • 代码提交自动执行单元测试

  • 单元测试通过后自动部署整体的环境

  • 自动执行集成自动化测试(Service/UI)

  • 自动生成构建的详细测试报告,同时自动通知相关人员

持续集成所需的支撑有:

  • 测试环境自动部署脚本

  • 代码覆盖率自动收集

  • Java 应用:基于 JaCoCo+Jenkins 插件的方式

  • php 应用:通过 Xdebug+phpunit 的方式

  • 测试报告相关插件及脚本

  • 代码静态检查等

对于持续集成我们后续的演进规划是朝着持续交付和持续部署的方向努力,在持续集成的基础之上,自动将代码部署到测试环境上方便测试人员进行手工测试。

# 总结

本文主要从整体上介绍了在有赞 SOA 化的进程中,测试推行的分层自动化实践,以及后续的发展方向,同时简单介绍了相关的测试框架结构。下面再从整体回顾一下我们的分层自动化的要点:

10071536fe1e8476d8d4fe1261eae975.png

单元测试:

  • 优先级最高

  • 粒度最细、覆盖面最全

  • 开发实施

服务测试

  • 对测试来说优先级最高

  • 从业务场景的角度切入

  • 系统外部接口100%覆盖

  • 关注系统间的依赖和调用

  • 测试实施

页面测试

  • 优先级相对最低

  • 只保证核心功能的自动化覆盖,只关注UI层的问题

  • 通过数据mock的方式减少对后台数据的依赖。

  • 测试实施

至于各层投入的具体比重,还是需要根据项目的需求来实际规划。在《Google 测试之道》一书,对于 Google 产品,70%的投入为单元测试,20%为集成、接口测试,10% 为UI层的自动化测试。

最后再提一些观点吧:

  • 越底层的自动化,收益越高

  • 质量不是测试人员一个人的事情

  • 自动化测试的目的不是为了减少手工测试,而是为了测试人员做更多更有意义的手工测试(end)

 往期推荐 

?

  • 转给你的老板,如何给程序员更少的薪水?
  • 20年3月数据库排行榜
  • v2ex:飞机上用的是什么操作系统?

80754722c1b8a9ac99addd519bcde6fd.png

f261bdf0cda9635b9cb934f81e70eb66.gif

点击

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android+自定义alertdialog,安卓自定义AlertDialog

AlertDialog.png使用方法 example:DialogUtil.showAlertDialog(getActivity(), R.mipmap.restart, "退出提示", "你确定要退出吗&#xff1f;"),"确定", "取消", true, new DialogUtil.AlertDialogBtnClickListener() {Overridepublic…

mysql datetime 后面带了很多0_面试官:MySQL 表设计要注意什么?

作者 孤独烟来自公众号&#xff1a;孤独烟引言大家应该知道烟哥最近要(tiao 咳咳咳)&#xff0c;嗯&#xff0c;不可描述&#xff01;随手讲其中一部分知识&#xff0c;都是一些烟哥自己平时工作的总结以及经验。大家看完&#xff0c;其实能避开很多坑。而且很多问题&#xff0…

android studio viewo,Android Studio 之 ViewModel

ViewModel 是 JetPack 类库中的一个功能&#xff0c;可以保存控件的状态 &#xff0c;在整个Activity 生命周期中&#xff0c;状态不会失效如屏幕翻转时&#xff0c;状态可保留&#xff0c;不会失效&#xff01;与 LiveData 配合使用&#xff01;配合 Room 进行 Sqlite 操作数据…

极域电子书包课堂管理系统_朝阳群众说小康 | 从黑板课本到VR互动课堂、电子书包,朝阳的课堂如此有趣!...

教育变迁一支粉笔、一块黑板、一本教材曾经是教师上课沿袭了几十年的“三大法宝”随着时代发展当科技遇上了教育课堂上又会擦出什么样的火花呢&#xff1f;今天&#xff0c;小朝带你走进咱朝阳的校园一探究竟不一young的朝阳教育近日&#xff0c;教育部“基于教学改革、融合信息…

安装引导黑屏_给电脑安装系统老是装不上,重启就黑屏,原来是这项设置在作怪!...

很多人和我反映说&#xff1a;给电脑安装系统重启电脑后就黑屏无法正确解压系统&#xff0c;这个问题大家有没有遇到呢&#xff1f;遇到这个问题的人可能会认为自己电脑的硬盘坏了&#xff0c;明明已经把需要的Windows操作系统拷贝到硬盘已经成功了&#xff0c;重启电脑准备解压…

如果表不存在则创建_当创建一个文件的时候,操作系统发生了什么

操作文件是我们平时经常有的操作。但是我们可能并不是很了解他们原理&#xff0c;比如为什么删除一个很大的文件&#xff0c;会非常快&#xff1f;创建一个文件的时候&#xff0c;系统发生了什么&#xff1f;为什么删除的文件&#xff0c;还可以恢复&#xff1f;知其然知其所以…

两个html页面之间通讯,面试官:前端跨页面通信,你知道哪些方法?

引言在浏览器中&#xff0c;我们可以同时打开多个Tab页&#xff0c;每个Tab页可以粗略理解为一个“独立”的运行环境&#xff0c;即使是全局对象也不会在多个Tab间共享。然而有些时候&#xff0c;我们希望能在这些“独立”的Tab页面之间同步页面的数据、信息或状态。正如下面这…

默认选中_双击dwg图纸,怎么设置默认天正打开?

文尾左下角阅读原文看视频教程好课推荐&#xff1a;零基础CAD&#xff1a;点我CAD室内&#xff1a;点我 周站长CAD&#xff1a;点我CAD机械&#xff1a;点我 Bim教程&#xff1a;点我CAD建筑&#xff1a;点我CAD三维&#xff1a;点我全屋定制&#xff1a;点我 ps教程&#xff1…

临颖一高2021高考成绩查询,临颍一高举办2021年决战高考百日冲刺誓师大会

原标题&#xff1a;临颍一高举办2021年决战高考百日冲刺誓师大会3月4日&#xff0c;县一高举办2021年决战高考百日冲刺誓师大会&#xff0c;擂响了百日冲刺的战鼓&#xff0c;全校5800余名师生参加誓师大会。誓师大会在激昂雄壮的国歌声中拉开了序幕。县一高校长巩海生满怀深情…

2021年慈溪中学高考成绩查询,2021年慈溪市高考状元名单资料,今年慈溪市高考状元多少分...

高考状元一直都备受大家的关注&#xff0c;不管对于学校和还是当地教育系统&#xff0c;都是一件荣誉的事情。高考状元历来都诞生于艳羡的目光中&#xff0c;大家为他们的高分叫好&#xff0c;羡慕他们可以一步踏入国内知名学府。本文高考升学网为大家介绍历年慈溪市高考状元的…

网际风全推数据接口_智能风控系统设计与实践

导读在主流互联网产品中&#xff0c;比如搜索和推荐的系统&#xff0c;为了挖掘用户潜在购买需求&#xff0c;缩短用户到商品或信息的距离&#xff0c;提高用户的使用体验&#xff0c;都需要使用大量的特征来刻画用户的行为。在信息安全领域&#xff0c;建立在人工智能技术之上…

esp8266 html文件,ESP8266 基ESP8266_RTOS_SDK (ESP-IDF )中嵌入网页文件(示例代码)

场景&#xff1a;在写ESP8266 web服务的时候&#xff0c;免不了要将自己设计的网页html和css等文件放入到固件中。在arduino中有fs可以进行上传文件&#xff0c;然后通过文件系统读出。那在ESP-IDF中该怎么办呢。有几个思路1. 通过flash_download_tools 直接向固定地址写入文件…

高中计算机教师考试专业知识,高中教师资格证计算机专业考试内容

【导读】高中教师资格证计算机专业考综合素质、教育知识与能力和学科知识与教学能力&#xff0c;学科知识与教学能力是考计算机科学与技术的专业知识。高中教师资格证计算机专业考试内容高中教师资格证计算机专业考综合素质、教育知识与能力和学科知识与教学能力&#xff0c;学…

MySQL整数类型

整数类型又称数值型数据&#xff0c;数值型数据类型主要用来存储数字。 MySQL 提供了多种数值型数据类型&#xff0c;不同的数据类型提供不同的取值范围&#xff0c;可以存储的值范围越大&#xff0c;所需的存储空间也会越大。 MySQL 主要提供的整数类型有 TINYINT、SMALLINT…

LISP 冻结excel窗格_粗暴讲解,2分钟 | 即懂excel 冻结首行、首列和单元格怎么弄?...

多少人上手excel&#xff0c;都是基本功不扎实啊&#xff1f;&#xff01;想起当初自己学做数据&#xff0c;迫于不可抗力因素&#xff0c;糊里糊涂上岗。没囤过基础知识&#xff0c;全靠业务实践练操作。领导甩来什么需求&#xff0c;当天就要查各种方法给他做出来&#xff0c…

MySQL小数类型

MySQL 中使用浮点数和定点数来表示小数。 浮点类型有两种&#xff0c;分别是单精度浮点数&#xff08;FLOAT&#xff09;和双精度浮点数&#xff08;DOUBLE&#xff09;&#xff1b;定点类型只有一种&#xff0c;就是 DECIMAL。 浮点类型和定点类型都可以用(M, D)来表示&…

linux windows文件 编码_Mac, Windows和Linux电脑之间如何快速传输文件

Mac, Windows和Linux电脑之间如何快速传输文件本文介绍的方法主要适用于在家庭环境中的多台电脑之间快速传输文件&#xff0c;比如家中有三台电脑分别是Windows, Mac和Linux系统&#xff0c;如果传输少量的小文件&#xff0c;那么可以直接使用微信等通讯软件就可以了。但是如果…

MySQL字符串类型

MySQL 中的字符串类型有 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET 等。 下表中列出了 MySQL 中的字符串数据类型&#xff0c;括号中的M表示可以为其指定长度。 VARCHAR 和 TEXT 类型是变长类型&#xff0c;其存储需求取决于列值的实际长度&#xff…

5000的台式计算机,预算5000的台式组装机配置清单_预算5000的台式组装机配置

5000的价格在游戏本里只能算是入门级别的。基本上3A游戏只能低特效运行&#xff0c;特效根本无法进行。但是台式电脑不一样。5000元基本可以流畅运行市面上所有游戏&#xff0c;中高特效&#xff0c;1080p分辨率。接下来边肖会给大家推荐预算5000的桌面组装机配置列表。1.带显示…

三菱d700变频器模拟量控制_三菱Q系列PLC,用CCLink控制变频器正反转和多段速

硬件、软件设置&#xff1a;参阅三菱PLC&#xff0c;CC-Link通信协议基础知识远程输入(RX)定义&#xff1a;Rxn0&#xff1a;正转中Rxn1&#xff1a;反转中Rxn2&#xff1a;运行中(端子RUN功能)Rxn3&#xff1a;频率到达(端子SU功能)Rxn4&#xff1a;过负荷报警(端子OL功能)Rxn…