Транспортир + Жасмин: запустить один и тот же тест параллельно с различными входами данных - PullRequest
0 голосов
/ 30 апреля 2018

Интересно, есть ли возможность провести управляемые данными тесты с транспортиром + жасмин, чтобы выполнить его параллельно.

У меня есть следующее: 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 - фрагмент, чтобы сделать 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, но это плохая практика.

Может ли кто-нибудь указать мне правильное направление, если параллельно проводить тесты, основанные на данных транспортира.

1 Ответ

0 голосов
/ 02 мая 2018

Вам нужно знать, что транспортир работает параллельно со спецификационными файлами, а не 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'
  ]
};

// specs / template_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', ...},
  ...
];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...