为什么 Cucumber 不被视为测试工具?

Kai*_*ais 1 testing bdd cucumber

我是 Cucumber 新手,我正在尝试了解该工具。在阅读文档时,我发现它被简单地定义为“支持 BDD 的工具”

Cucumber 是一个支持行为驱动开发(BDD)的工具。

它还被描述为“验证工具”:

Cucumber 读取以纯文本形式编写的可执行规范,并验证该软件是否按照这些规范所述进行操作。

另一方面,我注意到在10分钟的教程中过度使用了“测试”这个词。

AFAIK,这个工具的作用是敏捷测试,因为它在 e2e 测试中大量使用(测试基础 = Gherkin 功能规范 + 步骤定义)。然而,该博客说的是不同的内容:

最后,记住 Cucumber 不是一个测试工具。它是一种用于获取对系统应如何工作的共识的工具。该工具允许您(但不要求您)自动验证系统的行为(如果您认为它有用)。

现在,如果这个工具并不是真正用于测试,那么它的用途是什么?

Kyl*_*rns 5

长话短说

\n\n

Cucumber 是一个 BDD 框架。其主要组成部分是:

\n\n
    \n
  1. Gherkin:一种无处不在的语言,用作沟通工具而不是任何东西,并且可以用作协作的跳板。它\n有助于管理业务的期望,如果每个人\n都可以\n以易于理解的格式看到您所做的更改,\n他们将希望减少对开发团队的挫败感,而且\n您还可以使用它来加快速度如果存在错误,\n可以通过编写 Cucumber 封装的测试来提高团队的反应时间\n,\n有人必须在某个\n点返回并调试它。
  2. \n
  3. CLI 实现(或 CLI):基于 Gherkin 的测试运行器。它是由志愿者开发的,他们都贡献了部分业余时间。每个实现都特定于支持可测试的生产代码的编程语言。它被视为具体的工具/实用程序。
  4. \n
\n\n

长版

\n\n

Gherkin 的预期用途是作为一种通信工具,从多个角度(或参与者)描述与系统的交互,并且恰好您可以将其与测试框架集成,这有助于确保现有系统正确处理这些交互。

\n\n

最常见的是,这是从用户的角度来看的:

\n\n
Given John has logged in\nWhen he receives a message from Brenda\nThen he should be able to click through to his message thread with Brenda via the notification\n
Run Code Online (Sandbox Code Playgroud)\n\n

但也可以从组件/页面的角度来看:

\n\n
Given the customer history table is displayed\nAnd there have been changes to the customer table for that user since the page was first loaded\nWhen it receives a click to refresh the data\nThen the new changes should be displayed\n
Run Code Online (Sandbox Code Playgroud)\n\n

这一切都是为了描述行为,并允许业务和开发人员自由协作,同时打破通常会困扰沟通的语言障碍,并且通常会使双方因缺乏相互理解而感到沮丧。一个问题

\n\n

这就是“乐趣”开始的地方 - 阿纳金,第三集

\n\n

您可以使用这些文件在整个开发团队(如果成功的话,更广泛的业务)中创建一个“活文档”环境,并且理论上 - 措辞和显示正确,这对于客户服务人员来说将是一个令人难以置信的福音,他们会更容易跟上变化,并且会有非常详细的描述帮助文档 - 不需要任何真正的额外努力,但这不是我在野外看到的很多东西。我在工作中编写了一个脚本,它通过将功能转换为 markdown 来实现此目的,并与其他各种 markdown 工具(mermaid用于图形、tsdoc-plugin-markdown生成 API 文档以及我选择的 HTML 转换器的各种扩展docsify)一起使用,我已经管理了生成一些不难导航的东西,并在团队之间打开沟通,以前发现很难将他们的问题传达给开发团队(现在大多数人都知道一点 Markdown,即使它必须被描述为“你在 Reddit 帖子和 YouTube 评论中输入的字符,使文本变为粗体和斜体等”,以便人们了解它是什么,但这意味着每个人都可以为此做出贡献)

\n\n

在调试测试时,它是一个非常有用的工具,特别是与剧本模式一起使用时(对于标准页面对象模型来说,情况不太如此,因为缺乏 pom 提供的附加上下文,但它仍然有用) ,因为所有内容的描述方式都会在失败时从用户或组件的角度复制问题。

\n\n

我将它与流程图配对,在流程图中我绘制了用户交互,将功能固定到它并能够以更直观的方式看到用户将能够执行我们可能没有计划的事情,或者甚至找出一些我们不知何故错过的花哨的场景。

\n\n

长版更长

\n\n

我这里的示例主要是在 javascript 中,因为我们一直在一个node环境中进行开发,但如果您想创建自己的版本,那么它应该不会有太大的不同。

\n\n

文档

\n\n

本质上,这只是为了以业务易于理解的方式显示功能文件(我也计划将测试报告集成到其中,并提供切换分支等的能力)

\n\n

看一下小黄瓜的格式

\n\n

首先,您想要获取 features 文件夹中所有文件的简单数组,并选出末尾带有“.feature”的文件。

\n\n

本质上,你只需要在这里展平ls(这可以改进,但我们要求使用节点的LTS版本,而不是一般的最新版本)

\n\n
Given John has logged in\nWhen he receives a message from Brenda\nThen he should be able to click through to his message thread with Brenda via the notification\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用 Gherkin 解析器遍历所有这些文件以提取场景需要进行一些设置,尽管这很简单,因为 Gherkin 具有非常明确的结构和已知的关键字。

\n\n

可能有很多自引用,因为当你将其归结为基础知识时,很多 Cucumber 都是构建在定义良好的组件上的。例如,您可以将场景描述为背景,可以有描述、标签和名称:

\n\n
Given the customer history table is displayed\nAnd there have been changes to the customer table for that user since the page was first loaded\nWhen it receives a click to refresh the data\nThen the new changes should be displayed\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以完全充实它以写入单个文件,或输出一些 Markdown 文件(确保在菜单文件中引用它们)

\n\n

流程图

\n\n

流程图可以更轻松地帮助可视化问题,并且有一些工具可以使用 Markdown 来帮助生成它们,如下所示:

\n\n

生成的流程图,带有交互式按钮,可以快速点击到我们感兴趣的用户旅程

\n\n

在后面,它最终看起来像这样:

\n\n
### Login\n\nCustomers should be able to log into their account, as long as they have registered.\n\n...\n\n\n```mermaid\n graph TD\n        navigateToLogin["Navigate to Login"] -->logIn{"Login"}\n        logIn -->validCredentials["Valid<br>Credentials"]\n        logIn -->invalidCredentials{"Invalid<br>Credentials"}\n        invalidCredentials -->blankPass["Blank Password"]\n        invalidCredentials -->wrongPass["Wrong Password"]\n        invalidCredentials -->blankEmail["Blank Email"]\n        invalidCredentials -->wrongEmail["Wrong Email"]\n        ...\n\n        click blankPass "/#/areas/login/scenario-blank-password" "View Scenario"\n        ...\n ```\n
Run Code Online (Sandbox Code Playgroud)\n\n

它本质上只是一种非常快速的可视化问题的方法,并将我们链接到文档中的正确位置以查找答案。该工具绘制了流程图,您只需在页面上的关键概念或想法之间建立联系(即新客户会获得不同的开始屏幕)

\n\n

剧本模式、宁静与调试

\n\n

我认为这里真正需要说的是,当您运行测试时,这是您的输出:

\n\n
\xe2\x9c\x93 Correct information on the billing page\n    \xe2\x9c\x93 Given Valerie has logged into her account\n        \xe2\x9c\x93 Valerie attempts to log in\n            \xe2\x9c\x93 Valerie visits the login page\n                \xe2\x9c\x93 Valerie navigates to \'/login\'\n            \xe2\x9c\x93 Valerie waits up to 5s until the email field does become visible\n            \xe2\x9c\x93 Valerie enters \'thisisclearlyafakeemail@somemailprovider.com\' into the email field\n            \xe2\x9c\x93 Valerie enters \'P@ssword!231\' into the password field\n            \xe2\x9c\x93 Valerie clicks on the login button\n            \xe2\x9c\x93 Valerie waits for 1s\n
Run Code Online (Sandbox Code Playgroud)\n\n

它将把测试的任何部分分解为描述,这意味着如果 CSS 发生变化,我们将不会搜索不再存在的内容,甚至新调试网站该区域的人也能够找到来自测试失败。

\n\n

沟通

\n\n

我认为所有这些都应该表明如何在更普遍的意义上改善沟通。这一切都是为了确保尽可能多的人可以访问这些项目,这些人可以输入有价值的东西(应该是您企业中的每个人)

\n