我正在进行分片(并行运行)我的Protractor测试并将每个测试的结果存储在数据库中。我需要一种方法将所有测试从单个测试运行中绑定在一起。计划是在配置中设置一个id并将其包含在DB中。问题是,配置会为每个分片测试重新运行(即多次)...所以我最终得到了多个ID。没有bueno。
那么,任何人都知道如何在分片测试运行开始时设置单个唯一ID 一次?
更新的
为了澄清,我希望Protractor本身可能有一个简单的解决方案。否则我只会创建一个id(例如,通过grunt / gulp / npm)并通过--params.specRunId=xxxxx
通过cli传递它。
答案 0 :(得分:1)
最好的方法是在每次运行的测试中创建一个唯一的id,因此您的代码应创建一个唯一的ID并使用它运行分片测试,然后为下一个测试生成一个新的。 您可以生成如下唯一ID:
function generateUIDNotMoreThan1million() {
return ("0000" + (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4)
}
答案 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();
});
});
}