【问题标题】:Protractor + Jasmine: Run same test in parallel with different data inputsProtractor + Jasmine:使用不同的数据输入并行运行相同的测试
【发布时间】:2018-10-10 11:52:17
【问题描述】:

想知道是否有可能使用量角器 + jasmine 进行数据驱动测试以并行执行。

我有以下几点: storeList.json - 一个带有输入参数的数组,用于测试单个商店。我们有大约 40 家商店 - 记录。

[
    {
     "storeId": "Store_ID_1",
     "storeController": "Store_Controller_1"
    },
    {
     "storeId": "Store_ID_2",
     "storeController": "Store_Controller_2"
    }
]

ordering.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 - 一个 sn-p 使 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 的副本,但这似乎是一种不好的做法。

谁能指出我正确的方向,让量角器数据驱动测试并行执行。

【问题讨论】:

  • 我从这篇文章开始了我的研究 :) 如果你有很多规范,并行执行测试并不是什么大问题,但是当你有一个包含多个规范的规范时会很痛苦输入参数....
  • 然后,在范围内设置参数,例如第一个实例采用前 0-10 个输入参数,第二个采用下一个输入参数范围 (10-20) 等等?
  • 这将迫使我拥有很少的 json 文件和一些 ordering.js 副本。我试图避免这种情况。理想的情况是在这里有某种数据提供者,以使测试数据驱动,但似乎 npm 中没有什么可以满足我的需求:(
  • 理想情况下,每个 tets 都依赖于自己的数据,并且每个测试彼此独立,例如应用密封模式。在你的情况下,我认为你必须分开/打破测试。您必须只维护输入数据,而不是测试代码。

标签: javascript testing protractor automated-tests qa


【解决方案1】:

您需要知道量角器与规范文件并行运行,而不是it 块跨越所有规范文件。所以一个解决方案是为数据行创建许多规范文件(每个规范文件的每行)。

//量角器conf.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);
    ...
  });

});

//数据/all.js

module.exports = [
  {storeId: 1, user: 'user_01', ...},
  {storeId: 2, user: 'user_02', ...},
  ...
];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 2019-04-20
    • 2019-11-14
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多