Cucumber BDD浏览器测试&x2013;处理名称相同但css不同的不同按钮?

Cucumber BDD浏览器测试&x2013;处理名称相同但css不同的不同按钮?,cucumber,bdd,gherkin,cucumberjs,Cucumber,Bdd,Gherkin,Cucumberjs,我正在尝试cucumber进行浏览器测试,并且第一次学习了BDD测试——所以我是BDD的初学者。我遇到了一个问题,想知道解决这个问题的最佳实践方法 (我将其用于node.js webapp,因此它是cucumber.js和selenium WebDriverJS,但平台对这个问题不重要) 说明: 在小黄瓜语法教程中,您经常会看到在特定页面上单击按钮的示例,例如: Given (something) When I click the submit button Then (something)

我正在尝试cucumber进行浏览器测试,并且第一次学习了BDD测试——所以我是BDD的初学者。我遇到了一个问题,想知道解决这个问题的最佳实践方法

(我将其用于node.js webapp,因此它是cucumber.js和selenium WebDriverJS,但平台对这个问题不重要)

说明:

在小黄瓜语法教程中,您经常会看到在特定页面上单击按钮的示例,例如:

Given (something)
When I click the submit button
Then (something)
实现这个步骤的步骤定义非常简单——只需让selenium使用与按钮匹配的css选择器定位元素,然后让selenium单击它

问题:

但是,如果在不同的页面上有不同的按钮,具有相同的“人类可读”名称(即Cumber step文本中的相同名称),但必须由不同的css选择器定位,该怎么办

似乎您不能拥有功能的本地步骤定义,但所有步骤定义都在所有功能之间共享。这意味着,如果您创建一个步骤“单击提交按钮”,如上所述,步骤定义必须用于测试具有提交按钮的整个webapp中的所有页面。我真的不确定怎样做才是正确的方法

问题:

处理此问题的最佳实践是什么


问题示例:

假设我们有3个页面,都有一个“下一步”按钮,它在每个页面上执行完全不同的操作,并且在DOM中的位置完全不同。假设我们每个页面都有一个功能。在每个功能中,涉及“下一步”按钮的场景如下所示:

Given I am on page xyz
And ...
And I click the next button
And ...
When ...
Then ...
问题是,在第一页上,“下一步”按钮可能位于“.next”按钮处,在第二页上它可能是“#someContainer.btn.btn primary”,在第三页上它可能是“#assetButtons li:nth child(3)”。如果每个功能都有一个本地的步骤定义,那么它们可以简单地如下所示:

this.Given(/^I click the next button$/, function(callback) {
    this.driver.findElement(this.webdriver.By.css(”.next-button”).click();
    callback();
});

this.Given(/^I click the next button$/, function(callback) {
    this.driver.findElement(this.webdriver.By.css(”#someContainer .btn.btn-primary”).click();
    callback();
});

this.Given(/^I click the next button$/, function(callback) {
    this.driver.findElement(this.webdriver.By.css(”#assetButtons li:nth-child(3)”).click();
    callback();
});
但是,由于步骤定义对所有功能都是全局的,并且您自然不能为同一个正则表达式创建两个步骤定义,“我单击下一步按钮”的步骤定义需要知道我们在哪个页面上,或者场景所指的是哪个“下一步”按钮


我自己的一些想法:可选阅读

  • 可能会使步骤名称不那么通用,并使它们也引用 按钮所在的页面:“我单击首页上的下一步按钮”。 问题是我们已经在场景中编写了 在那个页面上,所以它是多余的
  • 可以为不同屏幕上的“下一步”按钮指定不同的名称 页面–如“下一页首页”和“下一页搜索”
  • 可以使步骤定义检测您当前所在的页面,并根据需要使用不同的css选择器 在页面上。(它可以查询selenium的 例如,当前URL和查找要使用的css选择器, 基于步骤和当前页面中的按钮名称)
  • 可以在步骤文本本身中包含css选择器。但这并不是完全人类可读的,而且看起来不像BDD方式
  • 选择一个更高的抽象级别,在这里您不会谈论 按钮等,但更高级别的操作,如“我转到搜索结果中的下一页”。(总体而言,这似乎不是一个好方法——通常是准确的方法。) 步骤很重要,因为相同的操作通常可以在不同的环境中完成 方法,以及所有这些路径当然应该由测试来执行。例如,如果您也可以通过按“N”或滑动进入下一页,则这将只测试其中的1种情况(当然也可以在步骤文本中包括该情况)
但是什么是正确的方法呢?

说你“点击提交按钮”是不好的小黄瓜。你想写一个陈述句,陈述你在做什么,而不是你是如何做的。像“点击这个按钮”这样的命令句不应该出现在你的测试设计中。我理解你们的观点,即能够以多种方式做事,在这种情况下,这是一个重要的细节,但要尽可能抽象

你说你有三个“下一步”按钮,可以做三件完全不同的事情,在你的小黄瓜中说明这些动作

When I advance the image carousel
When I go to the next news page
When I view the next page of search results
至于不同的路径

When I swipe to view the next page of search results
When I use the keyboard to view the next page of search results
When I click on the next link to view the next page of search results
现在我们可以把它变成一个stepdef,它有三个不同的动作

cucumber and gherkin的重点不是让你的场景干涸,而是让它成为人类可读的、非程序员类型可以理解的、活生生的文档。如果你还有几句话要说,那就不是世界末日了。

“陈述句”实际上不是解决这个问题的正确方法。有时我们确实想测试特定的按钮、文本、单选按钮等,因为它们是用户体验的一部分,甚至是用户接受标准的一部分

例如,假设有一天客户告诉您功能良好。但是,他们希望更改某些Web元素的措辞和/或操作它们的顺序。如何测试它们?你必须处理细节

实际上,我们在Cucumber的不同抽象级别上进行测试是正常和典型的。一些是针对功能进行测试,而另一些是针对详细的UI/UX进行测试

Cucumber的创建者声称“BDD工具Cucumber不是一个测试工具”,我不同意这种说法。如果黄瓜不用于测试,那么甚至没有人会使用它。市场上有很多好的/更好的文档/通信工具

回到问题上来,我认为你的第三个选择是正确的

可以确定步骤