618 前端竞品分析研究(互动篇)

Stella981
• 阅读 481

智能化测试—

在互动中经常需要维护大量的状态,对这些状态进行测试验证成本较高,尤其是当有功能变动需要回归测试的时候。为了降低开发测试的成本,在这方面使用强化学习模拟用户行为,在两个方面提效:

  • mock 接口:将学习过程中的状态作为服务接口的测试数据;

  • 回归测试:根据 mock 接口数据回溯到特定状态,Puppeteer 根据强化学习触发前端操作,模拟真实用户行为;

什么是强化学习呢?

强化学习是机器学习的一个领域,它强调如何基于环境行动,获取最大化的预期利益。强化学习非常适用于近几年比较流行的电商互动机制:做任务/做游戏 -> 得到不同的奖励值 -> 最终目标大奖,在这类型的互动游戏中,奖励是可预期的,用户的目标是使得自己的奖励最大化。这个过程可以抽象为马尔科夫决策模型:玩家(agent)通过不同的交互行为(action),改变游戏(environment)的状态(state),反馈给玩家不同的奖励 (reward);这个过程不断循环迭代, 玩家的最终目标是奖励最大化。

接下来,我们使用比较简单的 Q-learning,来实现类似的智能化测试目的。

Q-learning

对于不同状态下,Q-learning 的 Q(s,a)表示在某一个时刻的 s 状态下,采取动作 a 可以得到的收益期望,算法的主要思想是将 state 和 ation 构建一张 Q-table 来存储 Q 值,根据 Q 值来选取能够获得最大收益的动作。Q 值的公式计算如下:

618 前端竞品分析研究(互动篇)

Q值计算公式

其中,s 表示 state,a 表示 action,α 为学习率,γ 为衰减率,r 表示 action 能带来的收益。

这个公式表示当前状态的 Q 值由“记忆中”的利益(max Q[s',a])和当前利益(r)结合形成。衰减率 γ 越高,“记忆中”的利益影响越大;学习率 α 越大,当前利益影响越大。Q-learning 的目标是通过不断训练,最后得到一个能拿到最多奖励的最优动作序列。

在赛车游戏中,玩家的交互行为包含购买车厢、合成车厢、做任务获得金币(为了方便理解,此处简化为一个任务);玩家从初始化状态开始,通过重复“action -> 更新 state”的过程,以下的伪代码简单的说明我们怎么得到一个尽量完美的 Q 表格:

// action: [ 购买车厢,合成车厢,做任务获得金币 ]// state: 包含等级、拥有车厢等级、剩余金币表示初始化 Q = {}while Q未收敛:  初始化游戏状态state  while 赛车没有达到50级:    使用策略π,获得动作a = π(S)    使用动作a,获得新的游戏状态state    更新Q,Q[s,a] ← (1-α)*Q[s,a] + α*(R(s,a) + γ* max Q[s',a])    更新状态state

简单的 demo 地址:
https://github.com/winniecjy/618taobao

Puppeteer

由上面 Q-learning 的训练过程,我们可以得到一系列的中间态接口作为 mock 数据,可以很快的回溯到特定状态进行测试,这一点在回归测试的时候十分有用。但是仅仅只是自动 mock 数据对效率提升还是有限,在 618 互动中,友商的互动团队结合 Puppeteer 对整个流程进行自动化测试。Puppeteer 是 chrome 团队推出的一个工具引擎,提供了一系列的 API 控制 Chrome,可以自动提交表单、键盘输入、拦截修改请求、保存 UI 快照等。

结合 Puppeteer 的一系列操作逻辑,部分是可以沉淀成为一个通用的测试环境的,比如:

  • 不同用户类型,如登录、非登录、风险、会员等;

  • 接口拦截 mock 逻辑;

  • 页面快照留存;

  • 页面性能数据留存;

  • 其他常见的业务逻辑,如互动任务体系,跳转后等几秒后返回,加积分;

  • ...

弹窗规模化—

在互动中,弹窗一直是视觉表现的一个重要组成部分,对 UI 有比较强的定制需求。

友商的思路是将所有的逻辑尽可能的沉淀。对于电商场景来说,弹窗的业务逻辑是可穷举、可固化的,而互动场景之下,UI 定制化需求很高,所以将 UI 层抽离, 仅对可复用的逻辑进行固化,以 DSL + Runtime 的机制动态下发。

618 前端竞品分析研究(互动篇)

表达层和逻辑层分离

结合这一套逻辑层模型,表达层/UI 层也可以相应的结构化。根据项目 > 场景 > 图层的维度,静态配置和动态绑定相结合,搭配对应的配置平台就可以实现动态下发。

总结—

对于智能化测试,80%的流程其实成本是相对较低的,从测试用例的生成到 puppeteer 自动化测试,都是可以参考学习的,图像对比的部分需要较多训练,对于固化的功能可以进行探索,如果是新的模式性价比较低。

对于弹窗规模化,部门内部的做法是将弹窗沉淀成一个通用的组件,只包含通用的兼容逻辑,包括显示/隐藏、弹窗出现底层禁止滚动、多弹窗层级问题等。对于 UI 和其他业务逻辑,复用性较低,所以每次都是重写。这种做法尽可能地保持了组件的通用性,在会场线比较适用,因为会场线的弹窗一般不包含业务逻辑(如抽奖、PK 等),但是对于互动线来说,复用的内容相较于弹窗的“重量”来说显得有些微不足道。友商的沉淀思路前提在于上游接口的逻辑需要可复用,上游逻辑如果无法固定下来,前端的互动逻辑也较难固化。总体来说,友商在互动方面的沉淀思路大部分是从开发提效出发,主要供给内部使用;京东内部已有类似的互动提效方案终极目标是盈利,如京喜的社交魔方平台[1]和最近正在成型的满天星平台,所以沉淀方式都是以成套的 H5。

参考资料—

生产力再提速,618 互动项目进化之路[2]

机器学习相关教程 - 莫烦[3]

Puppeteer docs[4]

相关链接地址:

[1]

社交魔方平台: https://wqs.jd.com/cube/index.shtml

[2]

生产力再提速,618 互动项目进化之路: https://mp.weixin.qq.com/s/oe8UkHWHxb9oIoXGjoMz4w

[3]

[2] 机器学习相关教程 - 莫烦: https://github.com/MorvanZhou/tutorials

[4]

[3] Puppeteer docs: https://github.com/puppeteer/puppeteer/blob/v5.0.0/docs/api.md#httprequestresponse

本文分享自微信公众号 - 凹凸实验室(AOTULabs)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
liam liam
2年前
高效进行接口测试,简单易懂!
前言日常测试过程中,常常需要多种工具来接力完成自己的接口测试任务。比如说,使用swagger查看接口文档,使用mock编造接口数据对前端页面做测试使用postman测试后端接口,用Jmeter来做接口自动化测试/性能测试。那有没有一款软件可以完美集成以上所有的功能?笔者发现一款叫Apifox的软件,一款完成能完成以上几乎所有软件的功能。官方给出Apifox(
liam liam
1年前
接口测试工具简介!
一、Apifox的介绍1、目前接口测试的现状2、常用方案3、存在问题开发人员在Swagger定义好文档后,接口调试的时候还需要去Postman再定义一遍。前端开发Mock数据的时候又要去mockjs定义一遍,还需要手动设置Mock规则。测试人员需要去JMeter再定义一遍。前端根据mockjsMock出来的数据开发完,后
Stella981 Stella981
2年前
Mock工具之Mockito实战
在实际项目中写单元测试的过程中我们会发现需要测试的类有很多依赖,这些依赖项又会有依赖,导致在单元测试代码里几乎无法完成构建,尤其是当依赖项尚未构建完成时会导致单元测试无法进行。为了解决这类问题我们引入了Mock的概念,简单的说就是模拟这些需要构建的类或者资源,提供给需要测试的对象使用。业内的Mock工具有很多,也已经很成熟了,这里我们将直接使用最流行的Moc
Stella981 Stella981
2年前
618前端竞品分析研究(互动篇)
!(https://oscimg.oschina.net/oscnet/upbba177e2362c86a9d63b0a3807bd967509b.JPEG)作者:吉玉智能化测试在互动中经常需要维护大量的状态,对这些状态进行测试验证成本较高,尤其是当有功能变动需要回归测试的时候。为了降低开发测试的成本,在这方面使
Stella981 Stella981
2年前
RobotFramework接口自动化的设计思想
自动化终极思想:以目标为导向,不断抽象沉淀,消除冗余,做到测试数据与测试代码分离1、自动化测试对人员的要求1、对测试人员的技能要求较高,需要自己写测试代码或看得懂别人的测试代码;2、需要根据版本迭代进行更新测试用例,有一定的维护成本;3、自动化能发现的缺陷数(bug)远远少于手工测试,产出低;4、自动化测
Wesley13 Wesley13
2年前
MySQL 快速创建千万级测试数据
备注:此文章的数据量在100W,如果想要千万级,调大数量即可,但是不要大量使用rand()或者uuid()会导致性能下降背景在进行查询操作的性能测试或者sql优化时,我们经常需要在线下环境构建大量的基础数据供我们测试,模拟线上的真实环境。废话,总不能让我去线上去测试吧,会被DBA砍死的创建测试数据的方式
API 小达人 API 小达人
6个月前
【前端小技巧】如何使用 Eolink Apilkit 调用 Mock
在开发过程中,进度比较赶的情况下,前端人员当页面写完时,后台的接口还没写完,等要交付的时候后端才把接口给你,这个时候就很尴尬。这个时候Mock就可以很好的解决这个问题,前端团队可以在API还没开发完成的情况下,借助MockAPI实现预对接,加速开发进程。测试团队可以通过MockAPI解决不必要的系统,完成集成测试。EolinkApikit为前端工程师提供API文档管理,快速接口测试,以及MockAPI创建与调用,及查看文档变更历史的能力。有助于前端工程师快速查看API文档详情与历史记录,快速生成和使用MockAPI提前进行页面效果验证。
API 小达人 API 小达人
5个月前
JSON 格式的接口测试流程【Eolink Apikit】
在进行JSON格式的接口测试时,需要使用工具发送HTTP请求并获取响应。测试工具可以是单独的测试框架,如EolinkApikit。测试人员需要根据接口文档和测试用例编写测试脚本,然后运行测试并分析结果,以确保接口的质量和稳定性。当我们后端需要从前端拿到这些JSON数据,我们应该如何测试自己的接口呢?今天就来浅浅探讨一下JSON格式接口测试的流程。