Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Cucumber测试实践

Cucumber测试实践

作者头像
ThoughtWorks
发布于 2022-02-16 01:41:09
发布于 2022-02-16 01:41:09
99500
代码可运行
举报
文章被收录于专栏:ThoughtWorksThoughtWorks
运行总次数:0
代码可运行

来源:https://cucumber.io/docs/guides/overview/

作为QA,可能我们在迭代中总会遇到这样一些问题:

  1. 开发进行重构影响范围大,每次都需要进行大量的回归测试耗时耗力
  2. 一些技术卡如果测试又不知道具体影响范围,不测试又总是觉得不安心
  3. 一些客户会要求提供一些类似测试用例或者是测试报告之类的测试成果物,但是在敏捷流程中这些可能不是必需品,如果单独准备会很麻烦

这些问题Cucumber测试实践都会提供一些解决思路,并且还远不仅限于此。

一、思路转变

1、培养CICD意识

CICD,持续集成持续部署/交付不是什么新概念,但是时至今日对于测试者来说很少有人对于测试有这个意识。敏捷流程中的测试者还是按部就班的根据Issue卡的内容构思测试范围、设计测试场景、执行测试用例,如果做的好一点可能会在之后补充一下简单的自动化测试。于是会出现的一种节奏上的偏差,敏捷流程中往往伴随着大量的、短时间内的变化,如果测试者依照上面的流程应对这些变化,这就意味着大量的重复工作。举一个最简单的例子,一个有鉴权的系统光登录就是每次测试必要执行的。于是,当大量的变化、大规模的重构在迭代中发生时,这就意味着测试者的工作量会是之前涉及到的Issue卡的总和,可能就需要为了妥协而采取减少一些测试场景等等措施。

试想一下如果把我们的测试工作也做成一个持续集成的产品呢?把我们所做的测试工作全部有计划、有规律的拓印下来。对于之前执行过的测试,之后只需要one click即能执行,对于拓展的业务需求,只需要在已有的语法上进行拓展。交付产品不断迭代,测试集也在不断迭代。这样不仅节省测试工作量同样也会让QA对于整个产品质量框架有一个整体的把控。

2、尽量减少“徒手”测试

当我们有意识的去让我们的测试持续集成持续执行的时候,我们就会意识到“徒手”测试需要减少(但是在某些场景也是必须的)。因为徒手测试意味着一次性且相对低效,即便拓印下来这些徒手测试也是没有规律的无法拓展的。

3、行为与断言需要闭环,测试场景需要幂等

如同开发完成的功能都需要有Issue记录一样,QA的测试行为也需要尽可能全量的拓印下来。然而并不是所有的行为都能够称之为行为,其中需要意识到行为和实现是有区别的,我们希望记录的是具体的用户行为而不是这个行为中的每一步实践。同时尽量保证每个行为都能够自我验证,其中合适的断言是重中之重,我们需要记录我们目之所及尽可能多的能够确定的断言,让记录下的行为和我们徒手测试的验证项尽可能的一致。

当我们记录下一条条测试行为,形成测试场景。这些场景需要满足幂等性。这也是我们测试集能够持续集成持续执行的前提。

二、Cucumber测试实践

1、并不是BDD

根据维基百科,BDD是一种对于TDD在敏捷软件开发中的改进尝试,主要目的在用自然语言让DEV、QA、BA、PO对于程序如何运行形成一种共同理解。目前我们的Issue卡基本是类似BDD Gherkin的语法,而kick off 和 desk check这两个环节需要DEV、QA、BA等不同角色一起参加完成,这就类似于一种BDD闭环验证的实践。

然而,我们的目的是为了将我们在测试过程中的所有行为、断言利用程序记录下来,所以Cucumber是作为一种脚本工具来完成测试实践。在这个场景下我们测试的是一个已经开发完成的代码,这不是一种BDD。使用Cucumber并不意味着使用BDD。所以不需要给Cucumber测试别扭地加上一层BDD的外衣,而是将其作为一种脚本工具来统一实现测试执行行为,形成类似一种测试行为字典。

2、写好Gherkin

Cucumber执行流程如下

来源:https://cucumber.io/docs/guides/overview/

终于来到了Cucumber的实践操作,首先我们需要写好Gherkin,这也是我觉得Cucumber中最难的一块。我个人写Gherkin Feature文件的风格从刚开始接触Cucumber到现在有很大的区别。Gherkin的编写是整个Cucumber脚本程序可维护、可拓展、易理解、可复用的关键,也是避免Cucumber goes bad的关键。具体可以参考:https://cucumber.io/docs/bdd/better-gherkin/https://cucumber.io/docs/guides/overview/

3、Step Definitions断言很重要

至于Step Definitions就是和coding能力相关联,但是作为一个脚本工具需要尽量将项目轻量化、可移植化。我的做法是无论是Cucumber-jvm还是Cucumber-js都是会根据项目涉及到的数据库、后台或者是大数据组件来编写一些工具类,通过这些来组装Step Definitions。为了防止Cucumber goes bad,每个Step Definition需要尽可能简洁不要包含太多逻辑,但是需要体现我们设计的测试逻辑。因而在断言粒度上一定要贴近我们人工测试,这样才能让我们足够信任我们的脚本,这样脚本才能真正的起到作用。

断言的设计基本上是努力拷贝人眼,所见即所得,所见即是我们要断言的地方。但同时也不局限于此,对于很多场景来说人眼的观察是有限的,比如大量数据的比对、各种随机场景的模拟,这些脚本往往可以编写的超越人眼。

总而言之Step Definitions需要遵循的原则就是轻量、可维护但是要尽可能细腻的完成我们的行为和断言。这听起来好像有些悖论感,但是确实是我们的目标。

4、两种测试场景构建思路

如果阅读了“思路转变”这一章节,那么我们可能会有一种感觉这和我们平时测试时候设计测试思路或者测试用例感觉没什么区别,只是加了一些限制。这种感觉其实是很正确的。我们基于Gherkin的Feature文件实际上就是一个个测试用例集。同时我一直认为使用Cucumber或是其他工具来进行测试,都是需要基于QA的测试设计。测试设计是我们在执行测试工作的核心,于是,第一种测试场景的构建思路就自然而然的产生:通过测试思路或者测试用例来改写成基于Gherkin语言的Feature文件,转换方式如下图所示:

当我们按照上面那种构建思路组建了一些测试场景得到了一些Steps之后,我们很自然的会有这样一种想法:如果我们抛开测试设计和测试用例,从实际应用场景出发,利用Steps组建成一个真实可能发生的场景形成测试的Feature文件。因为我们在设计编写Steps的时候遵行了行为的原则,并且实现了每个行为的自我验证,那是不是就可以证明当我组建的这个Feature文件跑通那么整个场景我就已经验证完毕了,如下图所示:

三、关于E2E测试

1、Cucumber与E2E结合不是好的实践

在github上搜索Cucumber相关的开源项目,95%以上的都是将Cucumber和E2E测试工具相结合使用。从Cucumber+WebdriverIO到最近的Cucumber+Cypress和Cucumber+Testcafe。以实现的角度来说,这样的组合看起来没有什么问题,甚至在刚刚开始还比较好用。然而会存在以下几个问题:

(1)不是好的Gherkin写法如下图所示,这是官网对于Gherkin写法的一个范例,这也是前面所提到的Gherkin应该记录行为而不是行为对应的实践。然而几乎所有的Cucumber E2E项目都是下面这种写法。这样的做法可能从实现上讲差别不到甚至更优,但是表意上已经无法完成原有的意图。举一个例子,在登录场景中,Gherkin Steps应该这样写:When "Bob" logs in而不是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 Given I visit "/login"
  When I enter "Bob" in the "user name" field
    And I enter "tester" in the "password" field
    And I press the "login" button
  Then I should see the "welcome" page

(2)与PageModel或者PageObject不能很好的结合Cucumber E2E其中很核心的思路是将各种操作行为、断言抽象出来形成Steps。但是当这些成为Steps之后就很难成为某个Page的属性。其中很关键的问题在于,PageObject已经将页面定义为了主体,也就是Gherkin中的Given,不同的测试内容的Description就可以看成不同Scenarios,所以完全不需要Cucumber再进行一层包装,函数进行语义化命名就能完全表达意思。

(3)通常耗时耗力从原则上我总是这样认为,应该编写更少的 E2E 测试。端到端测试本质上是缓慢的,因此测试的数量应该大大低于其他测试的数量。Cucumber通常需要行为进行大量的兼容和适配,这些会消耗很多的精力。同时UI测试由于大量的智能缺失,很难匹配上人眼测试的粒度和效果,所以可以看到大量的UI测试都是固定化流程的不断重复,很多报错也是来自脚本本身而不是产品本身。整体来说无论怎么做UI测试性价比很低。

2、个人的解决方案

针对有Browser或者其他Client的项目,我会采用分离测试的方案。首先将自己模拟成各端触点来访问对应的后端,用Cucumber单独对后端进行测试,这一块会进行细粒度测试,保证功能和数据的准确性。

对于Browser和Client端采用轻量化的E2E脚本进行操作主要确认主要功能可用、控制台无异常、简单弹窗断言,这些是脚本能搞定的。当然人工测试是必不可少的,因为在Browser和Client的维度,从目前技术来看人眼的断言和人脑的判断是远超过脚本的。另外Bug Bash等等方案也是对于Browser和Client展示测试很好的解决方案。

四、Cucumber相关资料

书籍:《The cucumber book》官方文档:https://cucumber.io/docs/cucumber/Cucumber-js: https://github.com/cucumber/cucumber-jsCucumber-jvm: https://github.com/cucumber/cucumber-jvm一个简单上手的IDEhttp://cuketest.com/

本文版权属Thoughtworks公司所有,如需转载请在后台留言联系。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ThoughtWorks洞见 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
推荐一款基于业务行为驱动开发(BDD)测试框架:Cucumber!
Cucumber是一个行为驱动开发(BDD)工具,它结合了文本描述和自动化测试脚本。它使用一种名为Gherkin的特定语言来描述应用程序的行为,这种语言非常接近自然语言,使得非技术人员也能够理解和参与测试。
测试开发技术
2024/06/25
4350
推荐一款基于业务行为驱动开发(BDD)测试框架:Cucumber!
浅谈BDD下的自动化测试框架
测试驱动开发(TDD)相信大家已经很熟悉了,而行为驱动开发(BDD)其实是TDD的一种演化。那什么是BDD,为什么要使用BDD, BDD下的自动化测试该如何做呢?本文将通过简单的例子,向大家展示如何使用Cucumber 描述需求,编写、执行测试用例,并输出测试报告。
yuanyi928
2018/08/15
7.3K0
浅谈BDD下的自动化测试框架
行为驱动开发:一篇文章带你用 Python 玩转 BDD
相信大部分的人都听说过 BDD,即:行为驱动开发,但并未涉及到它的使用方和项目实战。
AirPython
2020/06/08
3.1K1
测试兵器谱のCucumber-JVM框架篇
最近业务上使用的自动化测试项目在改进项目执行方案,优化框架,正好结合实践记录一下最近遇到的问题和解决方法,打算从以下几个部分跟大家探讨一下:
雷子
2021/03/15
1.6K0
测试兵器谱のCucumber-JVM框架篇
干货 | 基于 BDD 理念的 UI 自动化测试在携程度假的应用
Leo Li,携程高级软件工程师,负责度假 BDD-Test UI 自动化测试框架的研发、维护和迭代等工作。
携程技术
2020/06/24
2.8K0
干货 | 基于 BDD 理念的 UI 自动化测试在携程度假的应用
cucumber测试框架
1.1 什么是BDD(行为驱动开发)   首先了解一个概念,BDD(BehaviorDrivenDevelopment:行为驱动开发)为用户提供了从 开发人员和客户的需求创建测试脚本的机会。因此,开始时,开发人员,项目经理,质量保证,用户验收测试人员和产品所有者(股东)都齐聚一堂,集思广益,讨论应该传递哪些测试场景,以便成功调用此软件/应用程序。这样他们想出了一组测试场景。所有这些测试脚本都是简单的语言,所以它也可以服务于文档。
爱撸猫的杰
2019/08/24
4.1K0
你不知道的Cypress系列(1) --鸡肋的BDD
Behavioural Driven Development (BDD)是从TDD发展来的(什么,TDD你都不知道?!),它通过自然语言定义系统行为,以功能使用者的角度,编写需求场景,且这些行为描述可以直接形成需求文档,同时也是测试标准。
iTesting
2020/12/15
1.6K0
你不知道的Cypress系列(1) --鸡肋的BDD
分层测试
自动化测试一直是测试领域桂冠上的明珠,几乎所有的测试团队都有建立团队的自动化。测试团队的自动化建设也被认为是团队提效的必经之路,但搭建和使用自动化路但路却并非一帆风顺。搭建自动化但时候有很多框架可以选用,合理但选择适合该团队的框架可以事半功倍,同时选择了框架之后就要受制于框架。使用自动化很多时候因为学习以及维护成本高,让初衷是提效为目的的自动化,成为了加重测试工作量之殇。
luxididi
2020/06/14
5.9K1
如何在python下建立cucumber项目
Gherkin语言使用的是主要英文关键词Scenario、Given、when 、And、Then和But等,这些关键词可以转换成中文关键词,场景、假如、当、那么等。根据用户故事,需求人员或测试人员使用Gherkin语言编写好测试场景的每个步骤
顾翔
2024/09/10
1220
如何在python下建立cucumber项目
行为驱动开发:一篇文章带你用 Python 玩转 BDD
BDD,行为驱动开发是 敏捷软件开发 的一种技术,鼓励软件项目的所有成员之间的相互协助
AirPython
2020/06/10
1.9K0
行为驱动开发:一篇文章带你用 Python 玩转 BDD
使用Behave实现Python自动化测试BDD的强大实践
自动化测试是现代软件开发中不可或缺的一部分,它能够提高软件质量、加速开发周期并减少回归测试的成本。在Python领域,Behave作为一种行为驱动开发(BDD)工具,为开发人员提供了一种清晰、可读性强的方式来编写和执行测试用例。本文将介绍如何使用Python中的Behave库结合BDD来进行自动化测试,以及一些实际的代码示例。
一键难忘
2024/07/27
1K0
接口自动化测试框架Karate入门
在这篇文章中,我们将介绍一下开源的Web-API自动化测试框架——Karate介绍
顾翔
2019/12/11
3.1K0
接口自动化测试框架Karate入门
干货 | 携程机票前端UI自动化与持续集成升级实践
JinG、YuWang,携程前端开发工程师,负责机票主流程预定React Native技术栈相关开发工作。
携程技术
2020/05/09
1.2K0
干货 | 携程机票前端UI自动化与持续集成升级实践
客户端自动化测试研究
背景 测试作为质量保证极其重要的一环,在移动App开发流程中起到非常关键的作用。从开发工程师到测试工程师,人人都应具备良好的测试意识,将隐患和风险在上线之前找出并解决,可以有效的减少线上事故。 美团和大众点评App作为美团点评平台的主要入口,支持承载着美团点评各大业务。其中美团点评境外度假业务主要包括了出境游相关业务以及所有的境外城市站,也是美团点评非常看重和大力发展的业务线。为了保证质量,需要进行各项测试:冒烟测试[1]、功能测试、集成测试、专项性能测试,回归测试[2]。其中冒烟测试和回归测试大多由开发自
美团技术团队
2018/03/13
3.3K0
客户端自动化测试研究
码农,你真的了解TDD和BDD吗?
今天我们来谈一谈TDD 和 BDD 两项实践。我们先来说说 TDD,也就是测试驱动开发(Test Drvien Development)。
架构狂人
2023/09/24
1.1K0
码农,你真的了解TDD和BDD吗?
BDD测试框架之Cucumber使用入门
cucumber早在ruby环境下应用广泛,作为BDD框架的先驱,cucumber后来被移植到了多平台,简单来说cucumber是一个测试框架,就像是juint或是rspec一样,不过cucumber遵循的是BDD的原则。
软件测试君
2019/06/20
4.5K0
BDD测试框架之Cucumber使用入门
前端单元测试最佳实践:提升代码质量的秘密武器
大家好!今天我们来聊聊前端单元测试的最佳实践。在前端开发的世界里,单元测试就像是一把瑞士军刀,无论是新手还是老手,都能从中受益。那么,让我们一起探索如何通过单元测试提升我们的代码质量吧!
Front_Yue
2024/09/20
1990
前端单元测试最佳实践:提升代码质量的秘密武器
自动化测试框架Cucumber和RobotFramework的实战对比
一、摘要 自动化测试可以快速自动完成大量测试用例,节约巨大的人工测试成本;同时它需要拥有专业开发技能的人才能完成开发,且需要大量时间进行维护(在需求经常变化的情况下),所以大部分具有很好开发技能的人员不是很愿意编写自动化用例。但由于软件规模的高速增长,人力资源的逐步稀缺,自动化测试已是势在必行。 对于自动化测试首先需要保证其功能是对客户有价值的和正确可用的。而这一切的基础就是用例要能测试客户的需求,期望,最好能让客户参与到测试用例的开发过程中来或让客户评审测试用例,因此出现了ATDD、BDD等各种理论方法来
企鹅号小编
2018/02/24
2K0
自动化测试框架Cucumber和RobotFramework的实战对比
测试用例的管理
随着软件系统规模的持续增大,业务复杂度的持续增加,软件测试的复杂度也随之越来越大。而软件测试工作复杂度的直接体现,就是测试用例编写、维护、执行和管理,所以编写易读、易维护和易管理的测试用例可以有效的降低测试工作的复杂度。本文主要系统的介绍了测试用例的几种管理方法,包括每种的特点,适用场景以及实例。帮助不同的项目和团队,根据自己的情况选择适合的测试用例编写和管理方法,从而降低测试工作的复杂度,提高测试工作的效率。
ThoughtWorks
2021/08/23
1.2K0
测试用例的管理
Functional Testing in iOS
下面的Test Pyramid摘自Martin Fowler的 文章,越高层次产生的用户价值会更高且更慢,越低层次的产生的价值更低且更快,你所写的任何一行单元测试代码对于你的用户来说都是不可见的,他能感知到的只能通过UI来体现。可以看出我们需要很多的单元测试来保证我们的代码质量,这对开发人员来说是有巨大价值的,它能够帮开发人员快速发现且定位问题。
100000798482
2018/08/20
1K0
Functional Testing in iOS
推荐阅读
相关推荐
推荐一款基于业务行为驱动开发(BDD)测试框架:Cucumber!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验