【问题标题】:Big JS app testing - avoiding multiple karma.conf.js files大型 JS 应用程序测试 - 避免多个 karma.conf.js 文件
【发布时间】:2013-11-30 19:18:33
【问题描述】:

我使用 karma + jasmine + phantom 进行无头 Javascript 测试。

我遇到的问题是我有一个非常大的应用程序,其中包含很多要测试的 JS 模块。 所以我需要为每个案例定制模拟,并为每个案例定制包含。

karma.conf.js 只允许我拥有 files 数组,其中包含要包含的所有文件的模式,如果我的应用程序很小而不是包含大量文件和模块的大应用程序,那就太好了。

我的解决方案 - 为每个测试用例创建多个 karma.conf.js 文件。但这真的很糟糕,因为有这么多的配置文件是一个很大的膨胀,如果我想更改一个设置(如 autoWatch),我需要更改所有的配置文件。

我的其他解决方案 - 在karma.conf.js 前面编写自定义处理程序以处理其他参数(规范文件或文件夹以绕过因果关系以搜索其配置文件)并简单地动态构建files 数组。

现在我看到的问题是业力只运行一次,我将被限制运行一个测试规范......并且我不想修改业力本身

我也考虑过使用 Grunt,但还没有找到使其适用于多个测试用例的方法。

顺便说一下,我的理想结构应该是这样的:

拥有文件:

test/specs/category/unit1_spec.js
test/mocks/category/unit1_mock.js

配置文件:

files: [
  {
    'includes': [array_of_includes],
    'spec': 'spec_file'
  }
]

mock 文件会自动从相应的 mocks 目录中抓取。

我可以使用karma start test/specs/category,它会递归地运行文件夹中的所有测试用例。

tl;dr - 我想轻松地测试一个大型应用程序。

我将不胜感激任何处理此任务的建议。

【问题讨论】:

    标签: javascript testing gruntjs karma-runner


    【解决方案1】:

    使用 ENV 变量将参数传递给 karma.conf.js 中的文件:

    files: [
      include1, include2, ..., includeN,
      process.env.JS_TESTS + "/*.js"
    ]
    

    然后像这样运行业力:

    JS_TESTS=test/category2 karma start karma.conf.js
    

    【讨论】:

      【解决方案2】:

      您可以在 karma 配置文件中使用 require 语句。

      例如,在您的业力配置文件中,您可以这样做:

      files: require('./karma.conf.files')
      

      为了更全面的答案.. 我从这个链接找到了另一个解决方案:https://groups.google.com/forum/#!topic/karma-users/uAf7TuVBmCQ

      有 karma 0.8(当前稳定)

      // shared_conf.js
      module.exports = {
        port: 8080
      };
      
      // karma1.conf.js
      var shared = require('./shared_conf.js');
      
      port = shared.port;
      

      使用 karma 0.9(目前在金丝雀版本中):

      // shared_conf.js
      module.exports = function(karma) {
        karma.configure({
          port: 8080  
        });
      };
      
      // karma1.conf.js
      var shared = require('./shared_conf.js');
      module.exports = function(karma) {
        shared(karma);
        karma.configure({
          // override
        });
      };
      

      这对我来说可以从一个单独的配置文件中提取一组文件名。

      【讨论】:

      • 使用 karma 0.13,暴露的是 config,而不是 karmamodule.exports = function(config) { config.set({ files: ['a', 'b', 'c'] }) }。然后在karma1.conf.js中,除了有config.set方法外,还可以读取config.files等所有值并进行修改。
      【解决方案3】:

      grunt-karma 听起来非常适合您的需求。

      这是一个 grunt 多任务,它允许子任务有一个共同的配置,可以被特定的子任务覆盖。

      该插件将 Karma 配置整合到一个文件中。 例如:

      karma: {
        options: {
          configFile: 'karma.conf.js',
          runnerPort: 9999,
          browsers: ['Chrome', 'Firefox']
        },
        category1: {
          files: ['app/js/category1/**/*.js', 'test/category1/*.js']
        },
        category2: {
          files: ['app/js/category2/**/*.js', 'test/category2/*.js']
        }
      }
      

      【讨论】:

      • 这对我不起作用。如果我在每个模块下使用“文件”,最终会出现“无法使用 'in' 运算符在 中搜索 'src'”的错误。如果我使用“src”而不是“files”,它会运行,但这些文件永远不会被拉入测试。有什么想法吗?我昨天创建了一个帖子。 stackoverflow.com/questions/21467715/…
      【解决方案4】:

      我注意到,无论您传递给命令行的任何参数,都会在初始配置对象中得到这个参数 camelCased。

      > karma start i-wanna-debug
      
      module.exports = function (config) {
          config.set({
              singleRun: config.iWannaDebug ? false : true
          });
      };
      

      这允许您使用具有多个配置的单个 Karma 配置文件。

      【讨论】:

      • 谢谢。这正是我所需要的。在开发中,我会使用多个浏览器进行测试,但在 VSTS 中我只想使用 PhantomJS 进行测试。我没有在开发和测试环境中拥有两个不同的配置文件,而是在两者中都有相同的
      • 小提示:karma start i-wanna-debug 对我不起作用,我必须在前面加上 --,例如 karma start --i-wanna-debug。顺便说一句,单个破折号- 允许传递单个字符标志,例如karma start -iwd,而iwd 分别处理。
      猜你喜欢
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 2014-03-10
      • 1970-01-01
      相关资源
      最近更新 更多