【问题标题】:Looping on a protractor test with parameters使用参数循环量角器测试
【发布时间】:2014-02-07 17:53:47
【问题描述】:

我有一组几乎完全相同的烟幕测试。我想将它们放入一个循环中并在一组参数处循环。但是,测试是异步运行的,因此循环在测试运行之前完成。这导致测试在第 8 个参数上运行 8 次,而不是每个参数运行一次。

describe('Admin Console Campaigns', function() {
    var ptor;
    var adminUrl;
    var testParams = [
        {title: 'Dashboard', urlSuffix: '/communic8' },
        {title: 'Campaign Report', urlSuffix: '/Reports/Campaign' },
        {title: 'Partner Campaign Usage', urlSuffix: '/Reporting/PartnerCampaignUsage' },
        {title: 'Campaign Template Usage', urlSuffix: '/Reporting/CampaignTemplateUsage' },
        {title: 'Email Usage Report', urlSuffix: '/Reports/EmailUsage' },
        {title: 'Campaign Templates', urlSuffix: '/CampaignTemplates' },
        {title: 'Campaign Template Groups', urlSuffix: '/CampaignTemplateGroups' },
        {title: 'New Template', urlSuffix: '/CampaignTemplates/Add' }
    ];

    beforeEach(function() {
        ptor = protractor.getInstance();
        ptor.ignoreSynchronization = true;
        var testParams = smokescreenTestConfig.adminCampaigns;
        adminUrl = ptor.params.http + ptor.params.client + ptor.params.staging + ptor.params.sharedvue + ptor.params.admin;
    });

    afterEach(function(){

    });

    for(var i=0; i < testParams.length; i++){
        var testParam = testParams[i];

        it('should have a ' + testParam.title + ' tab', function() {
            testUrl = adminUrl + testParam.urlSuffix;
            basicTestFunctions.pageExists(testUrl, ptor, browser, testParam.title);
        }, 60000);
    };
});

有人知道如何强制循环等待测试吗?

【问题讨论】:

  • 我遇到了这个确切的问题。你找到解决方案了吗?
  • 是的,刚刚写了答案。应该早就这样做了。

标签: loops testing jasmine protractor


【解决方案1】:

好吧,不久前想出了这个,抱歉我忘了我在这里发过帖子。我们基本上在另一个文件中创建了一个配置数组(尽管这不是必需的,只是为了使代码更易于阅读),然后将该数组放入我们想要重复的测试上方的 var 中。然后我们将测试包围在一个循环内的函数中,并在每个循环中传递我们数组中的行。

var testParams = testConfig.testArray;

for (var i = 0; i < testParams.length; i++) {

  (function (testSpec) {
    it('write your test here', function () {
      //test code here
    });
  })(testParams[i]);

};

这里的关键是在循环的迭代中传递的函数末尾的“testParams[i]”。这会强制同步执行。

如果您想真正疯狂,我们最终还编写了一个批处理文件,该批处理文件在我们所有的客户中连续运行大约 50 次此烟幕。我们在大约 10 分钟内对整个平台进行烟幕处理。

【讨论】:

  • 感谢您回来更新此内容。这个解决方案对我有用!
  • 说循环有更多的it() 块。有没有办法可以根据第一个 it() 块中的条件 continue; 进行下一次迭代(跳过其他 it() 块)?我无法继续通话 - SyntaxError: Illegal continue statement
  • Chutzpah 或 Karma 是否识别这些测试用例?我可以在 SpecRunner.html 中使其工作,但 chutzpah/karma 无法识别..有什么意见吗?
【解决方案2】:

你也可以创建一个带有规格的数组:

var testParams = testConfig.testArray;

testParams.forEach(function(testSpec) {
    it('write your test here', function() {
        //test code here
    });
});

这应该类似于 Robert McCraw 提出的解决方案。

【讨论】:

  • 为什么是.map() 而不是.forEach()
  • @DanielKucal 结果没有区别,尽管在这种情况下使用forEach() 可能更合适,因为您只想循环而不期望构建结果数组。
【解决方案3】:

使用一些异步代码,你可以很容易地解决这个问题。

而不是运行it('description', function () { // my test }); 使用it('description', function (done) { // my test with a call to done() at the end }

你可以用这个sn-p作为例子:

for (var i = 0; i < 10; i++) {
  it('should work for ' + i, function (done) {
    setTimeout(done, 1000);
  });
}  

预期输出:

✓ should work for 0 (1000ms)
✓ should work for 1 (1001ms)
✓ should work for 2 (1001ms)
✓ should work for 3 (1001ms)
✓ should work for 4 (1001ms)
✓ should work for 5 (1001ms)
✓ should work for 6 (1002ms)
✓ should work for 7 (1001ms)
✓ should work for 8 (1001ms)
✓ should work for 9 (1002ms)

希望这会有所帮助。

【讨论】:

  • 此解决方案会引发错误“请勿在 WebDriverJS 测试中使用完成回调”。有什么想法吗?
  • 恐怕不行,你能贴一些代码吗? (最好在另一个问题上)
  • 在一个角度量角器测试中,如果我将您的确切 for... 示例粘贴到完成回调和 setTimeout 中,则测试错误并且控制台显示` /node_modules/protractor/jasminewd/index.js :44 throw new Error('不要在 WebDriverJS 测试中使用 done 回调 ^ 错误:不要在 WebDriverJS 测试中使用 done 回调。测试被修补为异步,并且当 webdriver 控制流为空时将终止。`跨度>
  • 好的,我会用 jasmine 试试(可能用 mocha 运行了这个 sn-p),如果我找到方法回来报告。
  • 如果你没有检查这个我们在上面找到了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
相关资源
最近更新 更多