我是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,知道从哪里开始。
感谢。
答案 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);