2016-10-01 3 views
2

Я проворачиваю (работает параллельно) мои тесты Protractor и сохраняю результат каждого теста в базе данных. Мне нужен способ связать все тесты из одного тестового прогона вместе. План состоял в том, чтобы установить идентификатор в конфиге и включить его в БД. Проблема в том, что config снова запускается для каждого проверенного теста (т. Е. Несколько раз) ... поэтому я получаю несколько идентификаторов. Нет буено.Установите уникальный идентификатор при запуске проверенных тестов

Итак, у кого-нибудь есть идея о том, как я могу установить единственный уникальный идентификатор, один раз в начале отложенного тестового прогона?

Обновление: Чтобы уточнить, я надеялся, что в самом Protractor может быть простое решение. В противном случае я просто создам идентификатор (например, через grunt/gulp/npm) и передам его через cli через --params.specRunId=xxxxx.

ответ

1

Я думаю, что это будет работать вам. Конфигурационный файл транспортира имеет опцию - beforeLaunch

Согласно экстракту belo от official documentation, он запускается перед полным тестовым прогоном и его хорошим местом для создания уникального идентификатора для полного тестового прогона.

Все параллельные испытания с долей этого UniqueID

Функция обратного вызова вызывается один раз конфиги считываются, но перед любой установкой среды. Это будет работать только один раз и до 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 
}, 

UPDATE: структура транспортир конфигурационного файла Теперь

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

Теперь мне нужно выяснить, как получить доступ к var, созданному в 'beforeLaunch' ... поскольку он называется _after_, конфиг читается, но доступен браузер _before_. Нет ничего проще. – Brine

+0

вы можете это сделать. Объявление переменной может быть снаружи и его чтение вместе с конфигурацией, а затем значение присваивается в 'beforeLaunch()', а значение переносится в объект браузера в 'onprepare()'. Я обновил ответ, как conf.js будет выглядеть :) – AdityaReddy

+0

Да, попробовал. К сожалению, для 'afterLaunch' недоступен ни var (' browser', либо config var), что в конечном итоге означает, что я должен завершить экзамены и отправить их для отчетности. Любой другой крючок, имеющий доступный «браузер», загружается для каждого осколка, так что это тоже не так. Я застрял. – Brine

1

Лучший способ создать уникальный идентификатор каждого запускаемого вами теста, поэтому ваш код должен создать уникальный идентификатор и запустить с ним проверенный тест, а затем сгенерировать новый для следующего теста. Вы можете создать уникальный идентификатор, который, как:

function generateUIDNotMoreThan1million() { 
return ("0000" + (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4) 

}

Код взят из: how to generate short uid like "aX4j9Z" (in JS) `

+0

Спасибо, но я ищу _where_ я могу установить идентификатор, а не как. Например. установка его в config не работает, потому что config запускается каждый осколок. – Brine

+0

Вам нужно сгенерировать новый тест, который не задан. – Adi

+0

Нет, только один для всего тестового прогона. Я обновил свой вопрос, чтобы помочь уточнить. – Brine

1

Вместо генерации случайного числа вы можете привязать его к идентификатору сеанса браузера.

В вашей конфигурации вместо назначения случайного идентификатора используйте browser.driver.getSession(). Это должно вернуть 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(); 
    }); 
    }); 
} 
+0

Хорошее предложение, и я его пробовал, но идентификатор сеанса привязан к браузеру и запускается по одному на каждый осколок, и, следовательно, каждый раз меняется. – Brine

+0

Это не было выяснено в вопросе Я был в предположении, что вам нужен уникальный идентификатор. – cnishina

Смежные вопросы