Ограничение экземпляра параллельного браузера в карме
Я хочу запустить несколько тестов с помощью Karma, используя несколько браузеров. Тем не менее, тесты являются интеграционными тестами, которые взаимодействуют с базой данных (получать и обновлять данные). Поскольку те же тесты выполняются в нескольких браузерах, все они взаимодействуют с одними и теми же тестовыми данными.
Следовательно, если тесты запускаются одновременно в нескольких браузерах, один тест может повлиять на другие тесты, запущенные в других браузерах.
Как я могу ограничить количество одновременных браузеров, а при тестировании с несколькими браузерами? (например, установка лимита в 1 приведет к запуску тестов для каждого браузера последовательно, а не параллельно)
Ответы
Ответ 1
Это было исправлено в https://github.com/karma-runner/karma/pull/1646 и объединено в 0.13. 2:
concurrency
Тип: Номер
По умолчанию: Бесконечность
Описание: Сколько браузеров Карма запускается параллельно.
Особенно на таких устройствах, как SauceLabs и Browserstack, имеет смысл только запускать ограниченное количество браузеров одновременно и только начинать больше, когда они завершатся. Используя эту конфигурацию, вы можете обезопасить, сколько браузеров должно работать сразу в любой момент времени.
http://karma-runner.github.io/0.13/config/configuration-file.html
Ответ 2
Просто грубая идея:
- Создайте оболочку вокруг кармы, чтобы создать объект конфигурации на основе ваших критериев
- В этом случае это будет объект конфигурации для каждого типа браузера. Думаю,
- У вас может быть "шаблон конфигурации", хранящийся в файле
karma.conf.js
без свойства браузера
- Там есть программный способ "обогатить" этот шаблон, добавляя дополнительные свойства
- Заполнение очереди этими объектами конфигурации (это может быть простой массив)
- Используйте API кармы, чтобы запустить сервер кармы, передавая правильную конфигурацию каждый раз
Совет. На этом этапе вы можете установить конфигурацию "обертка", чтобы остановить или продолжить, если запущенный экземпляр сталкивается с некоторыми ошибками
Этот фрагмент кода показывает, как загрузить и заполнить конфигурацию шаблона:
function getConfigTemplate(path){
var config = {
// Maybe you want to add/remove some files from the list
// based on some criteria
files: [...],
// Path of the template file
configFile: path
}
return config;
}
var template = getConfigTemplate('/path/to/the/file');
// Here I can append more stuff
template.browsers = ['Chrome']
Примечание: стратегия слияния, используемая в карме для двух конфигураций, работает следующим образом:
- Если свойство находится на шаблоне, то оно переходит прямо к окончательной конфигурации
- Если свойство не находится в шаблоне, тогда объект конфигурации "обертка" будет искать это свойство
- Если у вас есть свойство на шаблоне и добавьте больше на обертку, будет использоваться только первый, и последний будет проигнорирован.
Этот код вместо этого можно использовать для "цепочки" ваших серверов кармы:
var currentServer = 0;
var configs = [ ... ];
function startKarmaServer(config, callback){
karma.server.start(config, function (exitCode){
if(exitCode){
// an error occurred
// stop karma!
} else {
currentServer++;
callback();
}
});
}
function startServers(){
// here some code to run the karma servers in series
}
Я бы рекомендовал async.js для функции startServers
.
Если вы используете более старую версию кармы (0.10
или ниже), вы можете посмотреть в этом исправлении для закрытия веб-сервер после выполнения.
Кроме того, обратите внимание, что флаг интеграции Continuos (autoWatch
) должен быть выключен, чтобы сделать работу цепочки.
Ответ 3
Если вы используете grunt
с grunt-karma
, я написал эту задачу, которая делает то, что вы хотите.