循环使用参数的量角器测试

时间:2014-02-07 17:53:47

标签: loops testing jasmine protractor

我有一组完全相同的烟幕测试。我想将它们放入一个循环并循环一个参数数组。但是,测试是异步运行的,因此循环在测试运行之前完成。这导致测试在第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);
    };
});

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

3 个答案:

答案 0 :(得分:23)

好的,不久前想出了这个,对不起,我忘了我已经发布在这里了。我们基本上在另一个文件中创建了一个配置数组,(虽然这不是必需的,只是让代码更容易阅读),然后将该数组拉到我们想要重复的测试之上的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]);

};

这里的关键是&#34; testParams [i]&#34;在函数结束时传递循环的迭代。这会强制同步执行。

如果你想变得非常疯狂,我们最终还是编写了一个批处理文件,连续50次在我们所有的客户端运行这个烟幕。我们在大约10分钟内将整个平台吸烟。

答案 1 :(得分:8)

您还可以创建一个包含specs的数组:

var testParams = testConfig.testArray;

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

这应该像Robert McCraw提出的解决方案一样。

答案 2 :(得分:2)

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

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

您可以使用此代码段作为示例:

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)

希望这有帮助。