我是Cucumber的新手,我正在尝试了解该工具。在阅读the documentation时,我发现它很快被定义为“支持BDD的工具”:
黄瓜是支持行为驱动开发(BDD)的工具。
也被描述为“验证工具”:
黄瓜读取以纯文本形式编写的可执行规范,并验证该软件是否执行了那些规范所说的内容。
[另一方面,我注意到10-minute tutorial上的单词“ test”过多使用。
AFAIK,此工具是敏捷测试,因为它广泛用于集成测试和验收(或系统)测试中。但是,the blog表示不同的内容:
最后,请记住Cucumber是不是测试工具。它是一种用于获取对系统工作方式的共识的工具。如果您认为有用的话,该工具可以使您(但不需要)自动验证系统的行为。
现在,如果此工具不是真的要进行测试,那么可以预期还有哪些其他用途?
黄瓜是一个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文件(确保在菜单文件中引用它们)
流程图使帮助可视化问题更加容易,并且有一些工具使用降价来帮助生成问题,如下所示:
在后面,最终看起来像这样:
### 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 '[email protected]' into the email field
✓ Valerie enters 'P@ssword!231' into the password field
✓ Valerie clicks on the login button
✓ Valerie waits for 1s
它将把测试的任何部分分解为描述,这意味着如果CSS发生更改,我们将不再搜索不再存在的内容,甚至是调试该站点区域的新手也可以选择从测试失败开始。
我认为所有这些都应说明如何从更一般的意义上改善交流。所有这些都是确保可以输入尽可能多的有价值的东西(应该是您业务中的每个人)的人访问这些项目。