写点什么

行为驱动开发在携程机票前端研发流程中的实践

  • 2020-02-19
  • 本文字数:3058 字

    阅读完需:约 10 分钟

行为驱动开发在携程机票前端研发流程中的实践

前言

过去,在携程机票前台团队保障研发质量的体系中,采用先开发后测试的模式,测试验收环节以手工测试为主。


机票预订研发流程中 BDD(行为驱动开发)模式的引入,统一了技术人员和非技术人员对软件行为描述的语言,均衡了自动化测试与手工测试之间的关系;入门级中文编程易读易用,且支持细颗粒度用例及海量用例复用。

一、困境

传统的敏捷软件开发,产品经理根据用户诉求和商业目的撰写 PRD 文档,测试工程师基于 PRD 文档考虑边界值和场景排列组合产出测试用例文档,软件工程师按照自己对需求的理解实现代码,最后的验收环节由手工测试完成。


在这个过程中,容易出现这些问题:

各方低质量的沟通

产品经理和技术人员分别站在不同的角度,使用不同的专业术语描述软件的行为,这使得沟通往往反复进行。

难以维护与线上逻辑一致的文档

PRD、用例文档和软件代码都是对软件行为的描述,要保持这三份文档逻辑的同步是投入高收益少的事情,实际上他们通常是不同步的。如果遇到项目重构或团队人员变动,需要花费较多的时间才能整理与线上软件行为一致的文档。

先开发后测试放大风险

实际项目经验表明:问题暴露的时间越临近发布时间,修复问题的成本越大。

手工测试限制迭代速度

每次发布前,投入手工测试做回归,周期长,成本高,限制了发布的次数。

UI 自动化成本高覆盖低

自动化测试需要较高的编程能力,对于功能测试人员门槛较高。


我们尝试通过 BDD 缓解这些问题。

二、什么是 BDD

什么是 BDD ?参考维基百科的描述:


行为驱动开发(英语:Behavior-driven development,缩写 BDD)是一种敏捷软件开发的技术,它鼓励软件项目中的开发者、QA 和非技术人员或商业参与者之间的协作。BDD 最初是由 Dan North 在 2003 年命名,它包括验收测试和客户测试驱动等的极限编程的实践,作为对测试驱动开发的回应。在过去数年里,它得到了很大的发展。

BDD 的重点是通过与利益相关者的讨论取得对预期的软件行为的清醒认识。它通过用自然语言书写非程序员可读的测试用例扩展了测试驱动开发方法。行为驱动开发人员使用混合了领域中统一的语言的母语语言来描述他们的代码的目的。这让开发者得以把精力集中在代码应该怎么写,而不是技术细节上,而且也最大程度的减少了将代码编写者的技术语言与商业客户、用户、利益相关者、项目管理者等的领域语言之间来回翻译的代价。


使用 BDD 的敏捷软件开发包括以下关键步骤:


  • 需求各利益方(产品,测试,开发)对需求进行充分讨论

  • 讨论基于软件的行为展开

  • 讨论的产出为自然语言书写的非程序员可读的测试用例文档

  • 产出的测试用例能在自动化测试平台上执行

  • 程序员专注于编写代码通过测试用例


BDD 是一种软件过程的思想或者方法,而不是一个技术框架或者系统。


为了建立 “自然语言测试用例文档”和“自动化测试代码”间的关联关系,需要用到支持 BDD 工具,我们使用了 Cucumber。


为了实现 BDD 中“测试用例能在自动化测试平台上执行”,需要用到 UI 自动化测试框架,我们使用了 Macaca。

三、BDD 改造过程

Cucumber

Cucumber 是一种支持行为驱动开发的工具。Cucumber 提供了一套名为 Gherkin 的语法规则,一个功能的描述由多个场景组成,一个场景由多个语句组成。


以 “假如( GIVEN )” 开头的语句描述的是场景的前提条件、初始状态, 以 “当( WHEN )” 开头的语句表示采取某个动作或者是发生某个事件, 以 “那么( THEN )” 开头用来描述一种期望的结果。每条自然语句将和一个代码编写的自动化测试方法对应,这让整个文档变得可执行。


如下 feature 文档描述了在机票单程列表页的直飞优先排序功能:


# language: zh-CN功能: 排序-单程列表页
场景: 假如 跳转页面到[机票单程列表页] 当 点击[直飞优先按钮] 那么 第[1]程列表页按照直飞航班在前,中转航班在后排序
复制代码

Macaca

Macaca 是阿里开源的前端 UI 自动化测试框架。业内优秀的自动化测试框架不少,最终我们选择 Macaca 有以下几个原因:


  • 跨平台 API 统一性 — Macaca 支持 PC、Android、iOS 和 Hybrid,并从 API 的设计上抹平了各平台的差异,这样的设计对测试跨平台的 React Native 应用有利;

  • 文档和周边工具丰富 — Macaca 官方网站提供了丰富的中英文文档,有利于框架的快速接入使用,同时提供了 app-inspector 等常用工具,方便了控件的查找定位;

  • 多语言支持 — Macaca 支持使用 Java、JS 和 Python 编写测试脚本,其中 Java 和 JS 是团队中常用的开发语言,降低了学习成本;

  • 开源 — 能看到源代码,方便问题定位和功能扩展。

MEC


我们在 Cucumber 和 Macaca 的基础上,整合出一系列通用的工具和完善的文档,取名为 MEC (macaca eating cucumber)。为了让 BDD 变得轻松和高效, MEC 做了这些事情:

1)扩展 Macaca Api

支持在携程 app 中打开 Schema,绑定服务 Mock,登陆账号等功能。

2)提供开箱即用的公共自然语句

30+ 条,涉及交互、页面元素断言、服务 Mock、页面跳转等场景的可执行自然语句。

3)提供 CLI 改善使用体验

提供 10 个命令,涵盖项目初始化、打补丁、运行、下载 app、编译、生成报告等场景。

4)支持基于 UI ViewModel 的校验提升自动化测试覆盖率

基于 UI 自动化框架,能方便的对可视区域内的单个页面元素进行测试,但对以下场景则不能很好覆盖:


  • 基于多个页面元素的关系的判断 - 比如判断航班列表按照低价优先展示,航班在列表中的顺序越靠后,价格越高;

  • 长列表 - 需要把要校验的元素滑动到可视区域,才能获取;

  • 更快的执行速度 - 运行在移动设备上的 UI 自动化稳定性和执行效率不理想;


我们的解决方案是将页面上展示的信息用数据的方式发送给 MEC Server, 如 React 中把 state 发送出来,测试用例的断言部分,直接校验界面数据,而不再通过 UI 自动化框架实现。

5)实现 Cucumber 场景片段复用

编写 feature 有一个痛点:有的固定语句组合会出现在多个 feature 中。Cucumber 没有提供类似编程可以抽象公用方法的功能,这不利于用例的编写和维护。我们的解决方案是在原来的语法规则上做扩展,通过新增编译过程,把使用了场景片段复用功能的 feature 转义成标准语法的 feature。

6)支持业务方做语句扩展

MEC 作为通用的 BDD 解决方案,提供了 30+ 条开箱即用的自然语句,但对于业务方,也有封装与业务强相关的语句的需求。针对这样的使用场景,MEC 提供了 API,方便业务方对自然语言做扩展。

7)执行报告

MEC 提供了报告模板,用例运行结束会生成直观的运行结果报告。


8)文档和推广

为了向团队中的非技术人员和技术人员推广 BDD 模式,帮助手工测试利用 BDD 转型自动化测试,我们提供了接入文档。


四、测试开发同时进行

BDD 意味着相对于开发环节,测试可以同步进行或者先行;使用自然语言编写 feature 意味着原本的功能测试人员可以较容易的参与自动化测试。现在,研发流程从之前的先开发后测试演变为测试开发同时进行:


五、回顾

随着软件过程中引入 BDD,feature 文档统一了各方的沟通语言并作为一份活的文档,保持着与线上软件行为的一致,让各方更容易达成共识;研发模式的改变让测试开发工作可以同时进行,减少了发布前夕才发现问题带来的风险;质量保证环节从手工测试为主到自动化为主,降低了发布的成本并提高了准确性。


现在,国际机票预订主流程 UI 自动化测试用例覆盖率达到 90%+,集成测试成本降低了 75%。

附录

1、Macaca https://macacajs.github.io


2、Cucumber https://cucumber.io


作者介绍


任跃华,携程机票前台软件工程师,参与了国际机票 RN Clean Architecture 落地和 MEC 中文测试框架研发工作。


本文转载自公众号携程技术(ID:ctriptech)。


原文链接


https://mp.weixin.qq.com/s/TSvg0nVPTffLp9jfqU3wdA


2020-02-19 20:301288

评论

发布
暂无评论
发现更多内容

Fuzzing(模糊测试)的前世今生(下)

云起无垠

网络安全 漏洞挖掘 Fuzzing 模糊测试

实时渲染正在改变可视化游戏

3DCAT实时渲染

云计算 云服务器 云算力 渲染引擎 渲染

HIFIVE音加加 × 火山引擎:正版曲库+智能视频创作SDK,短视频全链路需求一站式解决!

曲多多(嗨翻屋)版权音乐

短视频 火山引擎 HIFIVE音加加 视频配乐 版权音乐

排查Linux恶意进程

灵霄

面对当下最热的多模态,为什么这些业界和学界专家说“不必追热点”

小红书技术REDtech

Fuzzing(模糊测试)技术,你真的了解吗?

云起无垠

AngularJS进阶(十一)AngularJS实现表格数据的编辑,更新和删除

No Silver Bullet

表格 AngularJS 12月月更

数字化改变了什么?WeLink在实践中给出答案

路过的憨憨

【愚公系列】2022年12月 微信小程序-Component组件

愚公搬代码

12月月更

如何选择正确的哈希算法?

Jackpop

AngularJS进阶(十三)JS利用正则表达式校验手机号

No Silver Bullet

正则表达式 AngularJS 12月月更

云原生中的标准化

穿过生命散发芬芳

云原生 12月月更

守护安全|AIRIOT城市天然气综合管理解决方案

AIRIOT

物联网 天然气

Python初学者必备!适合新手阅读的Github开源代码。。。

Jackpop

如何快速构建研发效能度量的指标体系?

Kyligence

数据分析 指标

技术分享 | 将覆盖反馈融入黑盒模糊测试技术提升测试效率

云起无垠

升维数智化底座 迈向高质量发展

用友BIP

AngularJS进阶(十)AngularJS改变元素显示状态

No Silver Bullet

AngularJS 12月月更 元素状态

直播 | 数据仓库?数据湖?停止纠结,流批融合的极速 Lakehouse来了!

StarRocks

#数据库

Fuzzing(模糊测试)的前世今生(中)

云起无垠

如何远程Debug内网(或者防火墙后)的Java服务

石臻臻的杂货铺

Java debug 后端

建筑中如何使用3D可视化?

3DCAT实时渲染

云计算 3D可视化 智慧建筑 BIM

子查询优化之 Semi-join 优化 | StoneDB 研发分享 #2

StoneDB

MySQL HTAP 数据库· StoneDB 12 月 PK 榜

如何借助低代码开发平台 YonBuilder 填补应用开发 “产能缺口”?

YonBuilder低代码开发平台

开发者 低代码

焱融全闪系列科普| 为什么 SSD 需要 NVMe?

焱融科技

云计算 高性能 nvme 文件存储 全闪存储

2022-12-02:有a块草莓蛋糕,有b块芝士蛋糕,两人轮流拿蛋糕, 每次不管是谁只能选择在草莓蛋糕和芝士蛋糕中拿一种, 拿的数量在1~m之间随意, 谁先拿完最后的蛋糕谁赢。 返回先手赢还是后手赢。

福大大架构师每日一题

算法 rust 福大大

观测云产品更新|应用性能新增服务清单功能;用户访问监测 Session 查看器调整;事件新增移动端跳转选项等

观测云

可观测性 观测云

Proxyless Mesh 在 Dubbo 中的实践

阿里巴巴中间件

阿里云 云原生 dubbo

Fuzzing(模糊测试)的前世今生(上)

云起无垠

ElasticSearch 低成本高可用最佳实践

冰心的小屋

elasticsearch 高可用性

让对外合作更高效,就用WeLink跨企业沟通

路过的憨憨

行为驱动开发在携程机票前端研发流程中的实践_文化 & 方法_任跃华_InfoQ精选文章