运行分片测试时设置唯一ID

时间:2016-10-01 16:19:08

标签: protractor

我正在进行分片(并行运行)我的Protractor测试并将每个测试的结果存储在数据库中。我需要一种方法将所有测试从单个测试运行中绑定在一起。计划是在配置中设置一个id并将其包含在DB中。问题是,配置会为每个分片测试重新运行(即多次)...所以我最终得到了多个ID。没有bueno。

那么,任何人都知道如何在分片测试运行开始时设置单个唯一ID 一次

更新的 为了澄清,我希望Protractor本身可能有一个简单的解决方案。否则我只会创建一个id(例如,通过grunt / gulp / npm)并通过--params.specRunId=xxxxx通过cli传递它。

3 个答案:

答案 0 :(得分:1)

最好的方法是在每次运行的测试中创建一个唯一的id,因此您的代码应创建一个唯一的ID并使用它运行分片测试,然后为下一个测试生成一个新的。 您可以生成如下唯一ID:

function generateUIDNotMoreThan1million() {
return ("0000" + (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4)

}

代码取自:how to generate short uid like "aX4j9Z" (in JS)`

答案 1 :(得分:1)

我想这对你有用。量角器配置文件有一个选项 - beforeLaunch

根据official documentation的belo摘录,它会在完整的测试运行之前调用,并且是为完整测试运行生成唯一ID的好地方。

所有并行测试共享此uniqueID

  

调用一次configs的回调函数,但在任何之前   环境设置。这只会运行一次,然后才会运行。

我有一个基本的示例设置

    var test_run_id;
    beforeLaunch:function(){
       test_run_id = Math.random(); // Have a better ID generation logic here
    },

on-prepare()中并将值设置为全局变量browser.specRunId以供后续使用

onPrepare: function() {
 browser.specRunId= test_run_id
 },

更新:现在量角器配置文件的结构

var test_run_id;
exports.config = {
    specs: ['demo.js'],
    framework: 'jasmine2',
    baseUrl: 'http://www.protractortest.org/',
    multiCapabilities: [{
        'browserName': 'chrome',
        name: 'browser1'
    }],
    beforeLaunch: function() {
        test_run_id = Math.random();
    },
    onPrepare: function() {
        browser.runid = test_run_id
    },
};

答案 2 :(得分:1)

您可以将其与浏览器会话ID绑定,而不是生成随机数。

在您的配置中,使用browser.driver.getSession()而不是分配随机ID。这应该返回WebDriver promise of Promise<Session>。您可以解决承诺并获得session id

可能是这样的:

beforeLaunch: {

  // may need to call browser.get('some URL') for the driver
  // to get a session id

  return new Promise((resolve, reject) => {
    browser.getSession().then((session) => {
      browser.session_id = session.getId();
    });
  });
}