我是 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,不知道从哪里开始。
谢谢。
最佳答案
没有什么特殊原因不能。
就 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 为您提供了强大的表达能力,可以根据您的需要随意进行函数调用 - 如果某人的库似乎没有以对您的用例有意义的方式构建事物,您可以随时编写包装函数并实现“更好”的接口(interface)。
关于javascript - 使用 Yadda 和 Protractor 重用步骤定义,迭代所需的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37254652/