Ограничение экземпляра параллельного браузера в карме

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