使用Yadda和Protractor重用步骤定义,遍历所需的文件

时间:2016-05-16 13:05:52

标签: javascript protractor bdd yadda

我是JavaScript的新手,我最近开始使用Protractor和Yadda编写自动化测试,以便我可以使用Gherkin。但是,我发现步骤定义似乎不可重复使用,即如果我运行该功能

testMyWebAppRocks.feature

它将使用

中定义的步骤
testMyWebAppRocks.steps.js

但是,可能是该功能文件中的几个相同步骤,例如

    Given I am on the homepage

将出现在另一个要素文件中,例如

testThisParticularPartOfMyWebAppRocks.feature

并要求在与该功能对应的步骤定义中重写步骤。显然这不太理想,不适合DRY,对于一个非常复杂的单页Web应用程序,可能需要对许多功能执行相同的步骤。

那么,有没有办法将所有步骤定义加载到库中并针对该库运行功能?做这类事情的最佳做法是什么?

显然,我不想将我的所有场景都填充到一个无法管理的功能文件中,同样也需要使用步骤定义。我也不想继续重复相同的代码。

更新

好的,所以我通过加入我的图书馆找到了解决这个问题的方法

var library = englishLibrary.library();
var firstSteps = require('./steps/first-steps')(library);
var secondSteps = require('./steps/second-steps')(firstSteps);
var yadda = Yadda.createInstance(secondSteps);

我现在的问题是,这很快就会变得非常难看,是否可以在循环中执行此操作?如果我可以使用glob,那么我不需要知道实际的步骤定义名称,但我真的不太了解JavaScript,知道从哪里开始。

感谢。

2 个答案:

答案 0 :(得分:0)

没有特别原因你不能。

就JS而言,您基本上可以在任何地方传递任何值,包括将内容传递给require个调用。

这是否是一个“好”的结构完全是另一个问题。

您可能会注意到,您实际传递给given when等方法调用的内容是函数 - 如果您发现自己一遍又一遍地传递相同的函数,为什么不将函数定义分解为./lib/common_test_functions库?

而不是:

Yadda.localisation.English.library()
.given('I am on the homepage', function() {
    // Code goes here
});

也许:

var testUtils = require('./lib/common_test_functions.js')
Yadda.localisation.English.library()
.given('I am on the homepage',testUtils.verifyHomePage)

没有什么可以说你 - 将匿名函数作为回调传递 - 您可以在任何地方定义函数,并在需要时传递它们。

你甚至可以这样做:

function myGivenWrapper(yaddaInstance,testText,testFunction){
    yaddaTestLib.given(testText,testFunction)
}
var yadda = Yadda.localisation.English.library()
myGivenWrapper(yadda,testUtils.homepage.givenText,testUtils.homepage.test)

JS为你提供了很多表达能力,只需你想要的shuffle函数调用 - 如果有人的lib似乎没有以对你的用例有意义的方式构建东西,你总是可以写包装函数并实现“更好”的接口。

答案 1 :(得分:0)

这样做......

var libraries = [
    require('./lib/hospital-library'),
    require('./lib/patient-library'),
    require('./lib/discharge-library')
];

var yadda = Yadda.createInstance(libraries);