Javascript 量角器+;Jasmine:用不同的数据输入并行运行相同的测试
想知道是否有可能使用量角器+jasmine进行数据驱动测试以并行执行它 我有以下资料: storeList.json—一个带有输入参数的数组,用于测试单个存储。我们有大约40家商店——唱片店Javascript 量角器+;Jasmine:用不同的数据输入并行运行相同的测试,javascript,testing,protractor,automated-tests,qa,Javascript,Testing,Protractor,Automated Tests,Qa,想知道是否有可能使用量角器+jasmine进行数据驱动测试以并行执行它 我有以下资料: storeList.json—一个带有输入参数的数组,用于测试单个存储。我们有大约40家商店——唱片店 [ { "storeId": "Store_ID_1", "storeController": "Store_Controller_1" }, { "storeId": "Store_ID_2", "storeController": "Sto
[
{
"storeId": "Store_ID_1",
"storeController": "Store_Controller_1"
},
{
"storeId": "Store_ID_2",
"storeController": "Store_Controller_2"
}
]
js—代码(量角器),它从上面的json中获取每个元素,并将其作为单独的测试执行
describe('Ordering', function () {
all(require('../../assets/data/storeList'), (storeData) => {
it(`Add all items with all modifiers to cart and checkout on ${storeData.storeId}`, async function () {
let user = await userGenerator.Registered(storeData);
await shoppingCartActions.fillCart(storeData,user);
await homePageActions.openCart();
await shoppingCartActions.validateCartMath();
await shoppingCartActions.proceedToCheckout();
await recommendedActions.continueToDeliveryOptions();
await deliveryAndTipsActions.pickupAnd15PercentTip();
await deliveryAndTipsActions.validateCartMath();
await deliveryAndTipsActions.continueToAddressConfirmation();
await pickupAddressConfirmationActions.continueToPaymentMethod();
await paymentActions.fillCardData(storeData);
await paymentActions.pay();
});
});});
all.js-一个使ordering.js有点数据驱动的代码段
module.exports = (data, test) => {
const rows = Array.isArray(data) ? data : [data];
rows.forEach((row, index) => {
test(row, index + 1)
})};
config.js
exports.config = {
seleniumAddress: 'http://localhost:4444/wd/hub',
baseUrl : 'localhost',
restartBrowserBetweenTests: true,
maxSessions: 3,
multiCapabilities: [{
'browserName': 'chrome'
}, {
'browserName': 'chrome'
}, {
'browserName': 'chrome'
}],
specs: ['./testsuite/ordering/*.js'],
allScriptsTimeout: 20000,
framework: 'jasmine2',
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 600000,
isVerbose: true,
},
onPrepare: () => {
global.all = require('./all');
}};
使用这个设置,我得到了3个chrome实例,每个实例都在运行ordering.js测试,并使用storeList中的所有可用数据输入。所以我执行了6个测试,但实际上我愿意并行执行2个测试
我尝试过的另一种选择是使用多个json进行数据输入,并使用js的副本进行排序,但这似乎是一种不好的做法
有人能告诉我并行执行量角器数据驱动测试的正确方向吗。您需要知道量角器是针对规范文件并行运行的,而不是它跨所有规范文件。因此,解决方案是为数据行创建许多等级库文件(每行每等级库文件) //量角器形态
var fs = require('fs');
var util = require('util');
var uuidv1 = require('uuid/v1');
function splitData2Sepc(datarows) {
datarows.forEach(function(row) {
let id = uuidv1();
let dataFilePath = './data/data_'+id + '.json';
let specFilePath = './specs/spec_parallel_'+id + '.js';
// read the spec template
let templatePath = './specs/template_01.js';
let template = fs.readFileSync(templatePath, 'utf8');
// generate data file for per row
fs.writeFileSync(dataFilePath,JSON.stringify(row));
// generate spec file for per row
let content = util.format('var row = require("%s");', dataFilePath);
fs.writeFileSync(specFilePath,[content, template].join('\n\n'));
});
}
var datarows = require('./data/all.js');
splitData2Sepc(datarows);
exports.config = {
capabilities: {
browserName: 'chrome',
shardTestFiles: true,
maxInstances: 3,
},
specs: [
'./specs/spec_parallel*.js'
]
};
//规格/模板_01.js
describe('', function(row){
it(`Add all items with all modifiers to cart and checkout on ${row.storeId}`, async function () {
let user = await userGenerator.Registered(row);
await shoppingCartActions.fillCart(row.user);
...
});
});
//data/all.js
module.exports = [
{storeId: 1, user: 'user_01', ...},
{storeId: 2, user: 'user_02', ...},
...
];
这可能有用吗?我从这篇文章开始了我的研究:)并行执行测试不是什么大问题,如果你有很多规范,但是当你有一个规范和多个输入参数时,这是一件痛苦的事……然后,在范围内设置参数,例如第一个实例取第一个0-10个输入参数,第二个取下一个范围(10-20)输入参数等等?这将使我不得不拥有很少的json文件和大量ordering.js副本。我尽量避免这样。理想的情况是在这里有某种数据提供者,使测试数据驱动,但npm中似乎没有什么可以满足我的需求:(理想情况下,每个TET取决于自己的数据,每个测试彼此独立,例如应用密封模式。在您的情况下,我认为您必须分离/中断测试。您必须只维护输入数据,而不是测试代码。