限制Karma中的并行浏览器实例

时间:2014-11-06 21:21:19

标签: javascript testing karma-runner

我想使用多个浏览器使用Karma运行一些测试。但是,测试是与数据库交互的集成测试(获取和更新数据)。由于在多个浏览器中运行相同的测试,因此它们都与相同的测试数据进行交互。

因此,如果测试在多个浏览器中同时运行,则一次测试可能会影响在其他浏览器中运行的其他测试。

如何在使用多个浏览器进行测试的同时限制并发浏览器的数量? (例如,将限制设置为1将导致按顺序而不是并行地为每个浏览器运行测试)

3 个答案:

答案 0 :(得分:5)

这已在https://github.com/karma-runner/karma/pull/1646中修复并合并到0.13.2

  

并发

     

类型:数字

     

默认值:无限

     

描述:并行启动了多少浏览器Karma。

     

特别是在像SauceLabs和Browserstack这样的服务上,只有一次启动有限数量的浏览器才有意义,只有在完成这些浏览器时才开始更多。使用此配置,您可以分析在任何给定时间点应该一次运行多少浏览器。

https://karma-runner.github.io/2.0/config/configuration-file.html

答案 1 :(得分:0)

只是一个粗略的想法:

  • 围绕karma创建一个包装器,根据您的条件创建配置对象
    • 在这种情况下,它将是每个浏览器类型的配置对象我想
    • 您可以拥有一个"配置模板"存储在没有浏览器属性的karma.conf.js文件中
    • 有一种程序化的方式来丰富"此模板添加了更多属性
  • 使用这些配置对象填充队列(它可以是一个简单的数组)
  • 使用karma 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或更低版本),您可能需要查看at this fix才能在执行后关闭网络服务器。

另请注意,应该关闭Continuos Integration标志(autoWatch)以使链接起作用。

答案 2 :(得分:0)

如果您将gruntgrunt-karma一起使用,我写了this task来做您想做的事。