我是Cucumber的新手,我正在尝试了解该工具。在阅读the documentation时,我发现它很快被定义为“支持BDD的工具” :
黄瓜是一种支持行为驱动开发(BDD)的工具。
它也被描述为“验证工具”:
Cucumber读取以纯文本形式编写的可执行规范,并验证该软件是否符合这些规范所说的内容。
另一方面,我注意到10-minute tutorial上过多使用了“测试” 一词。
AFAIK,此工具是敏捷测试,因为它已广泛用于集成测试和验收(或系统)测试中。但是,the blog说的却有所不同:
最后,请记住,黄瓜不是不是测试工具。它是一种用于获取对系统工作方式的共识的工具。如果您发现有用的话,该工具可让您(但不要求您)自动验证系统的行为。
现在,如果此工具并非真正用于测试,那么可以预期还有哪些其他用途?
答案 0 :(得分:2)
黄瓜是一个BDD框架。其主要组成部分是:
Gherkin用作通信工具的目的,可以从多个角度(或参与者)描述与系统的交互,并且恰好可以将其与测试框架集成在一起,这有助于确保系统正确放置处理这些互动。
最常见的是,这是从用户角度来看的:
Given John has logged in
When he receives a message from Brenda
Then he should be able to click through to his message thread with Brenda via the notification
但是它也可以从组件/页面的角度来看:
Given the customer history table is displayed
And there have been changes to the customer table for that user since the page was first loaded
When it receives a click to refresh the data
Then the new changes should be displayed
这全都在于描述行为,并允许业务和开发人员自由协作,同时打破了通常导致交流困扰的语言障碍,并且通常由于缺乏相互了解而使双方彼此沮丧一个问题
您可以使用这些文件在整个开发团队(如果成功的话,还要开展更广泛的业务)中创建一个“活动文档”的环境,并且从理论上讲-正确地措词和显示方式,对于客户服务人员来说将是不可思议的福音,他们将更容易跟上变化,并且将对帮助文档进行非常详尽的描述-无需付出任何额外的努力,但这不是我在野外看到的很多东西。我已经编写了一个脚本,通过将功能转换为markdown以及其他各种markdown工具(用于图形的mermaid
,用于生成API文档的tsdoc-plugin-markdown
以及用于我选择的各种扩展)来编写脚本HTML转换器,docsify
)我设法生成了一些不难导航的内容,并在以前发现很难将其问题传达给开发团队的团队之间进行了交流(大多数人对此有些了解。天,即使必须将其描述为“您在reddit主题中键入的字符和youtube注释以使文本变为粗体和斜体等” ,但人们仍可以使用它。做出贡献)
当进行调试测试时,它是一个非常有用的工具,尤其是在与剧本模式一起使用时(由于pom提供的缺少附加上下文,因此与标准页面对象模型一起使用时较少,但仍然有用) ,因为从故障发生的角度,一切都会从用户或组件的角度促进问题的复制。
我已经将其与流程图配对,在其中我绘制了用户交互,将功能固定到其中,并能够以更直观的方式查看用户将能够执行我们可能未计划的操作,甚至找出我们以某种方式错过的一些华丽场景。
我的示例主要是使用javascript,因为我们一直在node
环境中进行开发,但是如果您要创建自己的版本,应该没什么不同。
从本质上讲,这只是用于以易于企业理解的方式显示功能文件(我也计划将测试报告集成到其中,并具有切换分支等的功能)
首先,您希望在features文件夹中得到所有文件的简单数组,并选择最后带有“ .feature”的文件。
本质上,您只需要在此处展平ls
(可以改进,但是我们要求使用节点的LTS版本,而不是通常的最新版本)
const fs = require('fs');
const path = require('path');
const walkSync = (d) => fs.statSync(d).isDirectory() ? fs.readdirSync(d).map(f => walkSync(path.join(d, f))) : d;
const flatten = (arr, result = []) => {
if (!Array.isArray(arr)){
return [...result, arr];
}
arr.forEach((a) => {
result = flatten(a, result)
})
return result
}
function features (folder) {
const allFiles = flatten(walkSync(path.relative(process.cwd(), folder)))
let convertible = []
for (let file of allFiles) {
if (file.match(/.feature$/)) {
convertible.push(file)
}
}
return convertible
}
...
使用Gherkin解析器浏览所有这些文件以提取场景时,需要进行一些设置,尽管这非常简单,因为Gherkin具有非常明确的结构和已知的关键字。
可能会有很多自我参考,因为当您将其归结为基本知识时,很多黄瓜是建立在定义明确的组件上的。例如,您可以将场景描述为背景,其中可以包含描述,标签和名称:
class Convert {
...
static background (background) {
return {
cuke: `${background.keyword.trim()}:`,
steps: this.steps(background.steps),
location: this.location(background.location),
keyword: background.keyword
}
}
static scenario (scenario) {
return {
...this.background(scenario),
tags: this.tags(scenario.tags),
cuke: `${scenario.keyword.trim()}: ${scenario.name}\n`,
description: `${scenario.description.replace(/(?!^\s+[>].*$)(^.*$)/gm, "$1<br>").trim()}`,
examples: this.examples(scenario.examples)
}
}
...
}
您可以完全充实它以写入单个文件,或输出几个markdown文件(确保在菜单文件中引用它们)
流程图使可视化问题变得更加容易,并且有一些工具使用markdown来帮助生成此类问题:
在后面,它看起来像这样:
### Login
Customers should be able to log into their account, as long as they have registered.
...
```mermaid
graph TD
navigateToLogin["Navigate to Login"] -->logIn{"Login"}
logIn -->validCredentials["Valid<br>Credentials"]
logIn -->invalidCredentials{"Invalid<br>Credentials"}
invalidCredentials -->blankPass["Blank Password"]
invalidCredentials -->wrongPass["Wrong Password"]
invalidCredentials -->blankEmail["Blank Email"]
invalidCredentials -->wrongEmail["Wrong Email"]
...
click blankPass "/#/areas/login/scenario-blank-password" "View Scenario"
...
```
从本质上讲,这只是一种非常直观的问题可视化方法,它可将我们链接到文档中的正确位置以找到答案。该工具绘制了流程图,您只需要在页面上的关键概念或想法之间建立联系(即新客户获得了不同的开始屏幕)
我认为这里真正需要说的是,当您运行测试时,这就是您的输出:
✓ Correct information on the billing page
✓ Given Valerie has logged into her account
✓ Valerie attempts to log in
✓ Valerie visits the login page
✓ Valerie navigates to '/login'
✓ Valerie waits up to 5s until the email field does become visible
✓ Valerie enters 'thisisclearlyafakeemail@somemailprovider.com' into the email field
✓ Valerie enters 'P@ssword!231' into the password field
✓ Valerie clicks on the login button
✓ Valerie waits for 1s
它将把测试的任何部分分解为描述,这意味着如果CSS发生更改,我们将不再搜索不再存在的内容,即使是调试该站点区域的新手也可以从测试失败中恢复过来。
我认为所有这些都应该表明如何从更一般的意义上改善沟通。就是要确保尽可能多的人可以输入这些项目,他们可以输入有价值的东西(应该是您业务中的每个人)