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

问题描述 投票:-1回答:1

我是Cucumber的新手,我正在尝试了解该工具。在阅读the documentation时,我发现它很快被定义为“支持BDD的工具”

黄瓜是支持行为驱动开发(BDD)的工具。

也被描述为“验证工具”:

黄瓜读取以纯文本形式编写的可执行规范,并验证该软件是否执行了那些规范所说的内容。

[另一方面,我注意到10-minute tutorial上的单词“ test”过多使用。

AFAIK,此工具是敏捷测试,因为它广泛用于集成测试和验收(或系统)测试中。但是,the blog表示不同的内容:

最后,请记住Cucumber是不是测试工具。它是一种用于获取对系统工作方式的共识的工具。如果您认为有用的话,该工具可以使您(但不需要)自动验证系统的行为。

现在,如果此工具不是真的要进行测试,那么可以预期还有哪些其他用途?

testing cucumber bdd qa
1个回答
2
投票

TL; DR

黄瓜是一个BDD框架。它的主要组成部分是:

  1. Gherkin:用作交流工具的普遍语言任何东西,都可以用作协作的跳板。它帮助管理企业的期望,如果每个人都可以以可消化的格式查看您所做的更改,希望减轻开发团队的挫败感,而且您可以使用它来加快团队的反应时间是错误,通过编写黄瓜用心态包装的测试有人将不得不回来并在某些地方对其进行调试点。
  2. CLI implementation(或CLI):基于嫩黄瓜它是由所有捐赠部分的志愿者开发的他们的业余时间。每个实现都特定于编程支持准备测试的生产代码的语言。它是被视为具体工具/实用程序。

长版

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

这全是描述行为,并允许企业和开发人员自由协作,同时打破了通常导致交流困扰的语言障碍,并且通常由于缺乏相互理解而使双方彼此沮丧问题

这是“乐趣”开始的地方 -Anakin,EP III

您可以使用这些文件在整个开发团队(如果成功的话,可以发展更广泛的业务)中创建一个“活动文档”的环境,并且从理论上讲-正确地措词和显示方式,对于客户服务人员来说将是不可思议的福音,他们将能够更轻松地跟上更改的步伐,并且将描述得非常详尽的帮助文档-无需付出任何额外的努力,但这并不是我在野外看到的很多东西。我已经编写了一个脚本,通过将功能转换为markdown以及其他各种markdown工具(用于图形的mermaid,用于生成API文档的tsdoc-plugin-markdown以及用于我选择的HTML转换器的各种扩展,[ docsify)我设法生成了一些不难导航的内容,并开放了以前发现很难将其问题传达给开发团队的团队之间的交流(如今大多数人都知道降价幅度,即使有被描述为“您在reddit主题中键入的字符和youtube注释以使文本变为粗体和斜体等”,以使人们了解其含义,但这意味着每个人都可以为此做出贡献)]

[它是调试测试时非常有用的工具,尤其是与剧本模式一起使用时(由于缺少pom提供的其他上下文,因此与标准页面对象模型一起使用时较少,但是仍然有用),因为如果发生故障,那么从用户或组件的角度出发,一切都会以促进问题复制的方式进行描述。

我已将其与流程图配对,在其中我绘制了用户交互,将功能固定到其中,并能够以更直观的方式查看用户将能够执行我们可能未计划的工作,甚至找出我们以某种方式错过的一些华丽场景。

较长的较长版本

我的示例大部分都是用javascript编写的,因为我们一直在node环境中进行开发,但是如果您要创建自己的版本,应该不会有太大区别。

文档

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

A look at the formatting of the gherkin

[首先,您希望在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文件(确保在菜单文件中引用它们)

流程图

流程图使帮助可视化问题更加容易,并且有一些工具使用降价来帮助生成问题,如下所示:

The generated flow chart, with interactive buttons for quickly clicking through to the user journey we are interested in

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

### 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发生更改,我们将不再搜索不再存在的内容,甚至是调试该站点区域的新手也可以选择从测试失败开始。

通讯

我认为所有这些都应说明如何从更一般的意义上改善交流。所有这些都是确保可以输入尽可能多的有价值的东西(应该是您业务中的每个人)的人访问这些项目。

© www.soinside.com 2019 - 2024. All rights reserved.