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

Protractor 在运行分片测试时设置唯一ID,protractor,Protractor,我正在切分(并行运行)量角器测试,并将每个测试的结果存储在数据库中。我需要一种方法将单个测试运行中的所有测试绑定在一起。计划是在配置中设置一个id,并将其包含在DB中。问题是,配置会针对每个分片测试重新运行(即多次)。。。所以我最终得到了多个ID。不,布埃诺 那么,有人知道我如何在分片测试运行开始时设置一个唯一的id吗 更新: 为了澄清这一点,我希望在量角器内部有一个简单的解决方案。否则,我将创建一个id(例如通过grunt/gulp/npm)并通过cli通过--params.specRunId

我正在切分(并行运行)量角器测试,并将每个测试的结果存储在数据库中。我需要一种方法将单个测试运行中的所有测试绑定在一起。计划是在配置中设置一个id,并将其包含在DB中。问题是,配置会针对每个分片测试重新运行(即多次)。。。所以我最终得到了多个ID。不,布埃诺

那么,有人知道我如何在分片测试运行开始时设置一个唯一的id吗

更新:
为了澄清这一点,我希望在量角器内部有一个简单的解决方案。否则,我将创建一个id(例如通过grunt/gulp/npm)并通过cli通过
--params.specRunId=xxxxx
传递它

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

function generateUIDNotMoreThan1million() {
return ("0000" + (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4)
函数生成器ID不超过100万(){

return(“0000”+(Math.random()*Math.pow(36,4)我想这对您很有用。量角器配置文件有一个选项-
在启动之前

根据belo-extract-from,它在完整的测试运行之前被调用,这是为完整的测试运行生成唯一ID的好地方

所有与共享此唯一ID的并行测试

一个回调函数,在读取配置后,在任何 环境设置。这将只运行一次,在onPrepare之前运行

我有一个基本的示例设置

    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
    },
};

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

在您的配置中,使用
browser.driver.getSession()
,而不是分配随机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();
    });
  });
}

谢谢,但我在寻找我可以在哪里设置id,而不是如何设置。例如,在配置中设置id不起作用,因为配置是在每个碎片上运行的。您需要在每个未设置固定的测试中生成一个新的id。不,只为整个测试运行生成一个。我更新了我的问题以帮助澄清。现在我需要弄清楚如何访问在
之前创建的varch
…因为它是在读取配置之后调用的,但在浏览器可用之前调用的。这不是一件容易的事。你可以这样做..变量声明可以在外部,它可以与配置一起读取,然后在
beforeloanch()
中分配值,并在
onprepare()中将值移植到浏览器对象
。我已经用conf.js的样子更新了答案:)是的,试过了。遗憾的是,无论是var(
browser
还是config-var)可用于
afterLaunch
,这是我最终必须完成测试并发送报告的地方。可用于
browser
的任何其他钩子都会为每个碎片加载,因此这也不存在。我被卡住了。没有问题..您是否尝试了
onComplete
-一旦测试完成,浏览器对象将调用此钩子是的,
onComplete
browser
,但也会重新加载每个碎片。我想我在
proces.env.specRunId
中保存了一个id,我在启动之前在
中设置了它。不过,不确定在服务器上多次运行时会发生什么:)这是一个很好的建议,我确实尝试过,但会话id与浏览器绑定,每个碎片运行一个会话id,因此每次都会更改。问题中没有对此进行澄清。我假设您需要唯一的id。