Cucumber 黄瓜测试 BDD 从入门到精通
Cucumber 是 BDD(Behavior-Driven Development,行为驱动开发)的一个自动化测试工具,使用自然语言来描述测试用例,使得 非研发(QA、PM)也可以理解甚至编写 测试用例。

- 撰写时,应该要以 PM 也能理解 测试用例 为目标去编写 Cucumber
Gherkin 是 Cucumber 用来描述 测试用例 的语言,以下为关键字的用意与关联关系。
- Given:新增 帐号abc@qq.com 、新增 概览1
- Then:校验 帐号abc@qq.com 是否能查看到 概览1
可以在多个 Step 上共用同一个 "简单" 参数,且每一个 Example 都视为一个 Scenario
- Gherkin 写在 .feature 文件中
- Step 对应的逻辑 写在 .java 文件中
通过 Gherkin 语法上的描述,找到与 注解 value 值匹配的 Java 方法,将 Gherkin 与 Java 代码关联起来。
- 当同时执行多个 Scenario 时,执行每个 Scenario 对应的 Java 文件都会被重新创建。
- 不同的 Scenario 之间,不应该存在数据依赖(MySQL),如果存在依赖,将会使 Scenario 变得脆弱可以在 Backgroud,进行数据清理,来保证测试结果的正确性
school.cucumber.io/courses/tak…
B:Business Language。
- Scenairo 中使用的词语应该使用【业务团队成员】能够理解的词语,否则将无法与业务团队成员互动。
R:Real Data。
- Scenairo 中应该使用 具体、真实 的数据(不要用 1、2、3、A、B、C),有助于让场景变得生动,并及早揭示边界条件与基本假设。
I:Intention Revealing。
- Scenairo 应该描述试图实现的意图,而不是描述程式将如何实现它的机制。
- 确保每一行 Step 描述的是 意图 而非 机制。 (比如:创建帐号,就不要写成 "将帐号数据写入 user 表,并在 account_project 表绑定帐号与项目的关联")
E:Essential。
- Scenairo 应该只保留必要的 Step,不直接促成结果的场景都应该被删除。
- 任何不能增加读者对预期行为理解的场景,都不應該出现在文档中。
F:Focus。
BRIEF
- 建议将大多数的 Scenairo 限制在五行或更少,这将使它们更易于阅读与推理,并有助于避免 同时测试多个规则 或 增加额外细节。
school.cucumber.io/courses/tak…
- 随时获得 你做的事情是否正确 的反馈
- 你的 Feature 可以变成描述你 系统功能 的 线上文档
- Scenairo 将会引导你的技术设计
school.cucumber.io/courses/tak…
- 在 Cucumber 中描述你想要实现的 Scenairo,把所有的 Step 串连起来,并运行 Cucumber 使其出现 失败 结果
- 持续实现 Step 与 API 的具体逻辑,并观察 API 是如何 失败 的,最终使 Scenairo 的结果变为 成功。
- 当测试通过后,对 API 实现进行 清理 与 优化(重构),使其更具可读性,并再次运行 Cucumber 保证重构后的结果正确。
以上为 测试驱动开发(TDD) 的 生命周期: Red、Green、Clean
推荐:在研发进行技术设计前,再多加一个 测试用例评审 的环节,让 PM、QA、RD 一起参与,方便及早发现问题,也能增加技术设计时考量的全面性
参数化 可以与 表格化、列表化、对象化 混用
Cucumber 支持在 Java 注解 中使用 {关键字} 作为占位符。 在 Step 中直接写上参数,将在 Java 代码中,会把占位符对应的参数作为方法参数传递进去。
下方的 List - Map、List - List、Map - List 都是共用同一套 Gherkin 代码,也就是说,同一个 Gherkin 代码,Cucumber 可以根据不同的方法参数类型,自动进行转换
记得加上 @Transpose,告诉 Cucumber 需要进行数据转换
在封装方法上方,需要加上 @DataTableType 注解
方法参数中,直接指定 对象封装方法 返回的 对象类型,Cucumber 就能直接进行关联
DataTable 与 List 必须作为 Java 方法的最后一个参数
List<Map<String, String>> 必须作为最后一个方法参数
List 必须作为最后一个方法参数
指定注解的 value,可以指定 Hook 的运行范围,不指定则表示在全项目生效。 注解可以定义在项目中的任意位置。
如果同时定义了多个钩子方法,则会依照注解中 order 属性的顺序多次执行。
Gherkin 代码
Java 代码
最终结果
Gherkin 代码在不同的 Scenario 上,可以增加 自定义注解 作为标记
Java 代码Hook 注解的 value 值,可以用来指定,只有当 Scenario 上有该自定义注解时,才会执行 Hook 方法。
如果想将 Hook 方法在多个自定义注解下进行复用,可以通过 , 隔开,例如:@Before("@MyHook,@YourHook")
最终结果
- 所有 模版功能 只运行在 测试项目(project_id = 1) (避免有时要指定 project_id 有时又不需要的麻烦)
- 使用 Gherkin 参数化 的 字串 功能时,使用 单引号 将字串包裹 (考虑到模版参数可能出现 Json 字串,使用双引号会需要额外进行转译)
- 模版参数中,不要出现 id(包含 帐号id、角色id、职务id ... 等),应该改用 名称(用户名、角色中文名称、职务名称)去反查 (使用 id 将无可避免的出现要使用 上下文 将多个 Step 进行关联的问题,这将使测试用例变得脆弱,所以宁可用 名称 去反查 id,也不要直接指定 id)
- Gherkin 语法表格化的表头字段,使用 下滑线命名法 来命名
- 模版方法名称定义遵守以下规范 (当一个模版可能同时存在于 Given 与 When 时,以 When 为主)
随时注意编写的模版是否尽量符合第 2 大项的最佳实践
通常为 Given 的最后一步,比如 帐号 要绑定 角色,一定是先创建好 角色,再通过 新增帐号 进行绑定
(创建前自动删除原来的帐号、创建时允许指定角色)
as cool as a cucumber和黄瓜没有关系?真实的意思你猜得到吗
Cucumber是我们生活中常见的一种蔬菜——黄瓜。因其口感爽脆,又绿色健康,深受人们的喜爱,尤其是一些励志减肥的人。但如果你听到老外形容一个人为“as cool as a cucumber”,那你千万不要理解错了,他可不是说那个人像黄瓜一样冷冷酷酷的,而是说那个人面临困难时十分冷静,泰然自若,和calm的意思比较相似。
I was petrified to take the stage, but Bella was as cool as a cucumber.
我十分害怕上台,贝拉却十分镇定自若。
除此之外,类似于as+adj.+as……结构的习语还有很多,有的根据直译可以理解其含义,有的类似于“as cool as a cucumber”一样不能逐字翻译去理解,一起来看看吧。
as easy as ABC 十分容易;非常简单
也可以说为“as easy as pie”。
After so many years as an accountant, doing taxes is as easy as ABC for me.
做了这么多年的会计之后,报税对于我来说十分简单。
as busy as a bee 十分忙
这个非常容易理解了,直接翻译的意思为“像蜜蜂一样忙”,就是指人非常忙。
My mother is as busy as a bee in the morning.
我的妈妈早晨忙得团团转。
as plain as day 显而易见
Plain指“清楚的、明显的”,形容事物就像在大白天一样的清楚,显而易见。
It's plain as day that they like each other. they've been flirting all evening!
很显然他们十分喜欢对方。他们一整晚都在打情骂俏!
church mouse指的是“教堂里的老鼠”,因为教堂是供教徒们做礼拜的神圣之地,所以是不允许吃东西的,并且在古时候的教堂里是没有食物的,因此用来形容人一穷二白,十分贫穷。
Some people are as poor as church mice, but they are happy.
虽然有些人一贫如洗,但是却活得十分开心。
as strong as a horse 十分强壮
She got into weight lifting a couple years ago and is strong as a horse now!
她练习举重好几年了,现在十分强壮!
as white as a sheet 面色苍白
His face went as white as a sheet when he saw the burglar in his house.
当他看到家里的窃贼时,瞬间脸都白了。
标题:cucumber、cucumber可数还是不可数
链接:https://yyuanw.com/news/gl/35912.html
版权:文章转载自网络,如有侵权,请联系删除!
用户评论
我记得小时候经常吃黄瓜凉拌的!
有13位网友表示赞同!
啊,黄瓜真是夏天的好伙伴!冰冰凉凉的太舒服了。
有11位网友表示赞同!
觉得是可数吧?毕竟它是独立的个体嘛?
有13位网友表示赞同!
我妈说黄瓜要看情况,有时候可以算作单独的存在,有时候就是整体。
有18位网友表示赞同!
比如“两根黄瓜”和“一盘黄瓜”的区别就很明显。
有12位网友表示赞同!
我也觉得黄瓜应该可数,因为我们平时会用数字来表达数量吧?
有5位网友表示赞同!
中文里很多东西都是看语境才能决定是可数还是不可数的呀!
有17位网友表示赞同!
要考虑具体情况下怎么说更自然才对。
有19位网友表示赞同!
像这种语言小知识挺有意思的,可以让我们在用语言的时候更加准确吧!
有19位网友表示赞同!
我还是比较习惯用“一根黄瓜”这个表达。
有17位网友表示赞同!
我觉得应该多看一些例句才能更好地理解哦~
有10位网友表示赞同!
这题考点还挺有趣的,我得去查查相关用法。
有9位网友表示赞同!
看来可数和不可数的界限有时候很难划分呢!
有18位网友表示赞同!
语言学真是太深奥了!
有18位网友表示赞同!
我还记得以前老师说过类似这个问题,但具体的内容我记不太清了。
有12位网友表示赞同!
黄瓜沙拉是我的最喜欢!
有5位网友表示赞同!
这种类型的文章总是让我觉得很有收获。
有10位网友表示赞同!
学习语言真是太有意思了~
有11位网友表示赞同!
期待看到答案!
有9位网友表示赞同!
我要去查一下词典看看是怎么定义的。
有6位网友表示赞同!