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

时间:2019-10-11 18:05:37

标签: testing cucumber bdd qa

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

  

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

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

  

Cucumber读取以纯文本形式编写的可执行规范,并验证该软件是否符合这些规范所说的内容。

另一方面,我注意到10-minute tutorial上过多使用了“测试” 一词。

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

  

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

现在,如果此工具并非真正用于测试,那么可以预期还有哪些其他用途?

1 个答案:

答案 0 :(得分: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文件(确保在菜单文件中引用它们)

流程图

流程图使可视化问题变得更加容易,并且有一些工具使用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 '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发生更改,我们将不再搜索不再存在的内容,即使是调试该站点区域的新手也可以从测试失败中恢复过来。

通讯

我认为所有这些都应该表明如何从更一般的意义上改善沟通。就是要确保尽可能多的人可以输入这些项目,他们可以输入有价值的东西(应该是您业务中的每个人)