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

干货 | 携程机票 React Native 整洁架构实践 作者简介任跃华, 携程机票前台软件工程师,从事机票android、react和react native技术栈相关研发工作。前言携程机票前台团队在使用 React Nati... 阅读详情

作者简介

 

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

前言

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

机票预订研发流程中 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

注:携程技术中心微信公众号后台回复“bdd”,下载讲师PPT。

【推荐阅读】

      “携程技术中心”公众号

         分享,交流,成长

图相似度模型(论文篇) 图相似度模型 阅读详情

相关推荐

DM-VIO论文精读:从‘延迟边缘化’到‘位姿图BA’,手把手拆解单目VIO性能超越双目的秘密

本文深入解析DM-VIO技术如何通过延迟边缘化和位姿图BA创新,解决单目视觉惯性里程计(VIO)的尺度不可观性问题,并在精度上超越传统双目系统。文章详细介绍了延迟边缘化的双因子图结构设计、位姿图BA的多级初始化策略,以及系统级优化带来的性能提升,为VIO研究与实践提供了重要参考。

weixin_30616969的博客 427

面试--各种场景问题总结

实现一个高度可靠且具备故障迁移能力的座位预订功能。

m0_59465624的博客 3010

深入解析Cuk、Zeta和Sepic拓扑:非隔离型开关电源的设计奥秘

本文深入解析了Cuk、Zeta和Sepic三种非隔离型开关电源拓扑的设计奥秘。它们均能实现升降压转换,但特性各异:Cuk拓扑输出反向电压,输入输出纹波极低;Sepic拓扑输出同极性电压,应用广泛;Zeta拓扑输出纹波小,适合精密供电。文章详细对比了其电路结构、工作原理、核心公式及选型指南,帮助工程师根据输入电压范围、输出极性及纹波要求,灵活选择最合适的拓扑方案。

weixin_28308325的博客 476

干货 | 前端跨端业务整合的探索与实践

作者简介Jeff,携程前端开发经理,对前端自动化技术感兴趣,推动了团队使用cucumber进行UI自动化测试。Harry,携程前端开发工程师,秉持“Don’t make me think...

携程技术 845

【机械视觉】Halcon—【二、Halcon算子全面介绍(超详细版)】

Halcon 的算子(operators)按照功能被系统性地划分为多个类别,官方文档中目前(Halcon 22.11 版本)共有 19 个主分类,每个主分类下还有若干子分类。 本人在此对这19个分类的常用核心算子进行了一系列的总结,且本人在文章最后还总结了一些案例经验。 注意: ​​​​​​​跨分类调用:某些算子可能在多个分类中,但官方文档中会明确其主分类。 例如: read_image(文件操作)常被其他分类(如图像处理)的示例调用,但其核心功能是文件读取。

qq_3517289697的博客 3913

深入解析STM32驱动AT25DF321A FLASH芯片的SPI通信与数据完整性验证

本文深入解析STM32通过SPI通信驱动AT25DF321A FLASH芯片的全过程,包括硬件连接、驱动函数实现与数据完整性验证。重点介绍SPI配置、读写操作优化及CRC校验方法,确保数据存储的可靠性,为嵌入式存储系统开发提供实用指南。

agile9scrum的博客 1064

干货 | 携程机票前端UI自动化与持续集成升级实践

作者简介JinG、YuWang,携程前端开发工程师,负责机票主流程预定React Native技术栈相关开发工作。一、前言随着携程机票APP全流程由Native技术栈转向RN(Reac...

携程技术 1175

基于STM32L4XX、HAL库的AD7124-8BCPZ模数转换器ADC驱动程序设计

/ 公式: Voltage = (adc_value / (2^23 - 1)) * Vref。// 模式控制位[7:5]=000 (连续转换模式)// 3.2 配置通道0,使其使用AIN0(+)和AIN1(-),并关联到配置0和滤波器0。= 0x14) { // AD7124-8的ID是0x14。// 双极性操作,缓冲AINP/AINN。

zhusl6688的博客 376

测试框架对比

目前,测试行业内,自动化框架很多,各有千秋

stay_hungry_yu的博客 880

在 ABAP 环境中创建 Job Catalog Entry 和 Job Template 的完整实践指南

摘要:本文介绍了SAP BTP ABAP环境中Application Job的云原生解决方案,对比传统后台作业模式。重点阐述了Job Catalog Entry和Job Template两大核心概念,通过库存重估业务场景演示如何实现可调度类、创建Job Catalog Entry及Job Template。文章详细说明了从ABAP类到Job Catalog Entry再到Job Template的完整链路,并分享实际项目中的设计经验和注意事项,帮助开发者将传统后台作业迁移到Application Job框架

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 231

27、振动信号实时并行处理与风力发电机模型鲁棒控制设计

本文探讨了振动信号实时并行处理与风力发电机模型鲁棒控制设计两大核心技术。在振动信号处理方面,提出基于FPGA、RT和PC三级架构的并行采集与处理系统,实现高效、实时的振动分析,适用于电机状态监测与预测性维护。在风力发电控制方面,研究风力农场布局优化(WFLO)问题,比较九种多目标元启发式算法性能,并提出基于扰动观察法的最大功率点跟踪(MPPT)控制策略,提升发电效率与系统鲁棒性。研究成果为工业设备智能监控与可再生能源优化提供了有效技术路径。

sunny的博客 72

java机票编程_携程预订机票后台java开发编程

这个要几个类的调用的,不是几行代码就可以解决的。如果用Servlet来做的话,Servlet就这样写publicclassBookServletextendsHttpServlet{privatestaticfinallongserialVersionUID=1L;publicBookServlet(){super();}protectedvoiddoGet(Http...

weixin_30780735的博客 374

LLC 谐振变换器开发设计1

本文档详细介绍了基于DSP28335的LLC谐振变换器开发设计。系统采用频率调制(FM)控制方式,实现高效率、高功率密度的隔离型DC/DC变换。文档阐述了LLC拓扑结构和工作原理,给出了谐振频率、品质因数等关键参数的计算公式。硬件设计包括功率器件选型和采样电路实现,软件部分提供了DSP28335的核心控制算法和代码示例,涵盖频率转换、PI控制和PWM生成。系统还设计了启动策略和保护机制,确保可靠运行。该设计实现了主开关零电压开通和低纹波输出特性。

329

干货 | 携程机票Sketch插件开发实践

作者简介尹正波,携程机票研发部前端工程师,专注设计和开发的交叉领域,用系统和工具改进设计体验和交付。Sketch 是伴随移动应用程序崛起而流行的 UI 设计工具。2014...

携程技术中心 4269

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

干货 | 携程机票前端Web流式通信SSE全链路应用实践

仅仅只是简单接入SSE是远远不够的,离不开全链路(SSE技术选型,多层网络架构的适配,服务间的流式通信等等)的支持,所以最终决定联合携程框架、SRE、机票前后端团队共同来实现对SSE全链路的适配,真正意义上实现全公司通用的普适方案。关于SSE原生流解析 与 fes流解析是不同语言实现的这一点,我们也思考了语言差异对性能的影响,所以对响应数据的解析耗时做了实验,在相同机器和网络环境下,对比了原生 SSE 和 fes 处理数据流的耗时,实验结论是两者在耗时上没有明显差异(毫秒级)。

携程技术 1305

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

干货 | 携程机票RN复杂交互实践

作者简介海涛,携程前端开发工程师,负责机票主流程预订、React Native技术栈相关开发工作。前言本文将主要介绍在携程中文APP国内机票模块中,对往返机票的预定流程改造期间,在Re...

携程技术 1703

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

干货 | 携程机票 App Kotlin Multiplatform 初探

作者简介陈琦,携程机票研发部无线研发总监,负责携程App机票业务的技术研发和管理工作。从2017年9月到2019年5月,经过一年半的努力,携程机票App团队完成 90% ...

携程技术中心 3292

干货 | 提升前端开发效率,携程机票定制代码生成器实践

作者简介Zilin Wang,资深前端开发工程师,擅长前端打杂,专注于Remix、Radix UI、Haskell等领域。Sheila Dai,资深前端开发工程师,关注前端性能优化、前端智能化。在日常的研发工作中,编写前端界面结构占据了一部分工作量。很多UI组件都存在共性,如何减少编写UI界面的开发时间,以及提取公用的前端组件,从而达到提升研发效能的目的,是我们的重要课题。在《前端智能化探索,骨架...

携程技术 3079

干货 | 携程机票前端Svelte生产实践

作者简介shuan feng,携程高级前端开发工程师,关注性能优化、低代码、svelte等领域。一、技术调研最近几年,前端框架层出不穷。近两年,前端圈又出了一个新宠:Svelte。作者是Rich Harris,也就是Ractive,Rollup和Buble的作者,前端界的“轮子哥”。通过静态编译减少框架运行时的代码量。一个Svelte组件编译之后,所有需要...

携程技术 1028

干货 | 破局传统埋点四大痛点!携程机票前端可视化埋点实践

事实上,可视化埋点支持多种类型的事件采集,这些埋点的主要区别在于触发时机不同,例如页面进入、离开、元素输入、失焦、曝光等。如上图所示,当用户点击节点 LA 触发埋点时,系统会顺着 fiberNode 节点的 return 属性向上查找父节点,并记录这条链路上的所有节点信息,最终组合成相对路径。河图现已融入公司内部的伏羲埋点管理系统(以下简称伏羲),作为其子系统,专注于可视化埋点领域,而伏羲则是一个集埋点开发、数据分析与管理于一体的综合系统。通过前文的阐述,相信读者已对可视化埋点的核心流程建立了系统理解。

携程技术 987

干货 | 携程机票前端安卓虚拟机测试集群建设实践

作者简介Liang,携程研发总监,关注DevOps,前端&服务端质量保障、能效提升;Tony,携程资深测试经理,关注自动化测试框架及平台类工具开发。一、背景在携程内部业务高频率敏...

携程技术 1037

干货 | 数据库压力降低90%,携程机票订单缓存系统实践

比如订单详情服务输出机票订单的状态、价格、航班、乘客等各类基本信息,同时依赖于机票的改签业务、退票业务、航变业务,支付业务等提供的查询服务,而这些独立的子业务与订单详情服务本身一样需要订单基本信息数据作为业务支撑。基于这种对用户行为的预测,我们考虑了在前一天的凌晨业务低峰阶段,将第二天业务高峰时间段内起飞的订单数据,提前加载到缓存中预热,将高峰时间段的一部分缓存构建压力,转移到了低峰时间段,既提高了低峰时间段的系统资源利用,也缓解了高峰时间段数据库的压力。缓存数据的总量保持平稳,同时避免了老旧数据的清理。

程序员高级码农的博客 1361

干货 | 携程机票大数据架构最佳实践

本文转载自 携程技术中心(ctriptech) 公众号,本文PPT请点击下面 阅读原文 获取  作者简介 许鹏,携程机票大数据基础平台Leader,负责平台的构建和运维。深度掌握各种大数据开源产品,如Spark、Presto及Elasticsearch。著有《Apache Spark源码剖析》一书。本文来自许鹏在〖DAMS 2017中国数据资产管理峰会〗上的分享,首发DBAplus社群(ID:db

Hadoop技术博文 3994

干货 | 携程鸿蒙应用开发实践

作者简介Gordon,携程资深移动开发工程师,关注鸿蒙开发。背景作为全球领先的一站式旅游服务平台,携程始终坚持以技术创新为发展核心。自鸿蒙发布以来,我们便投入研发力量进行调研、开发,并成功落地了携程机票项目、服务卡片项目等。现将鸿蒙项目中相关经验整理分享,希望能给大家一些参考,也希望鸿蒙发展能越来越好。一、鸿蒙系统简介华为鸿蒙HarmonyOS系统是面向万物互联的全场景...

携程技术 3907
上一篇: 干货 | Node.js在携程的落地和最佳实践
下一篇: 干货 | XGBoost在携程搜索排序中的应用
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值