【问题标题】:In what order does Karma run its tests?Karma 以什么顺序运行测试?
【发布时间】:2017-11-03 22:01:04
【问题描述】:

我正在通过 jenkins 运行 Karma 测试。 通常,当测试失败时,它会显示测试名称和测试编号,但在某些情况下,它只会显示编号。

Karma 是否按特定顺序运行测试?喜欢按字母顺序吗?

下面是我在 jenkins 上的控制台输出截图。

【问题讨论】:

    标签: angular testing jenkins karma-runner


    【解决方案1】:

    决定测试运行顺序的不是 Karma 本身。 主要决定测试顺序的组件是您决定与 Karma 一起使用的测试运行器。如果您使用 Mocha,那么将使用 Mocha 的逻辑。如果你使用 Jasmine,那么将使用 Jasmine 的逻辑。如果你使用其他东西,那么就会使用其他一些逻辑。

    例如,Mocha 会按照在测试文件中调用 describeit 的顺序运行测试。如果你有两个测试文件a.jsb.jsa.js 被首先执行,那么Mocha 将首先运行a.js 中的测试。如果先执行b.js,则Mocha 将首先运行b.js 中的测试。 Mocha 没有进一步排序。 (Mocha 有一个sort 选项,但它仅在使用mocha 命令行工具在 Node 中运行 Mocha 时使用。它不适用于在 Karma 中使用 Mocha,因为 Karma 在浏览器中运行 Mocha /em>,其中 Mocha 不支持sort。)

    如果您使用模块加载器(如 RequireJS 或 SystemJS)动态加载测试文件,这会使事情变得复杂。 如果您使用 require(["a", "b"]) 并且两个模块不相互依赖,那么它们加载的顺序是不确定的。 a 可能会先加载,或者b 可能会先加载,因此运行测试的顺序可能从一次运行到下一次不一致。您可以通过配置或嵌套require 调用来强制执行订单。 (例如,再次假设模块不相互依赖,require(["a"], () => require("b")) 确保a 中的测试将在b 中的测试之前执行。)

    更复杂的情况是,如果某些测试运行者确定您的 测试套件 有错误,他们将中止测试运行。这不会改变测试的顺序,但可能使它看起来像缺少测试。例如,Mocha 将用于设置和拆除测试数据的钩子中的错误(与测试本身的错误相对)视为测试套件中的错误,并将中止运行。如果您的三个测试依赖于失败的设置代码,Mocha 将跳过测试。您将看到三个测试中的一个失败,而不是三个失败。这是一个示例测试文件,其中包含 3 个测试和 before 挂钩中的失败。 (before 钩子,又名“before all”,用于在一组测试之前设置测试数据。)

    before(() => {
        throw new Error("oh no!");
    });
    
    it("one", () => {});
    
    it("two", () => {});
    
    it("three", () => {});
    

    这是我的karma.conf.js

    module.exports = function(config) {
      config.set({
        basePath: '',
        frameworks: ['mocha'],
        files: [
          'test.js'
        ],
        exclude: [
        ],
        preprocessors: {
        },
        reporters: ['progress'],
        port: 9876,
        colors: true,
        logLevel: config.LOG_INFO,
        autoWatch: false,
        browsers: ['Chrome'],
        singleRun: false,
        concurrency: Infinity
      })
    }
    

    这是输出(我已将时间戳替换为 <ts>):

    <ts>:INFO [karma]: Karma v1.7.0 server started at http://0.0.0.0:9876/
    <ts>:INFO [launcher]: Launching browser Chrome with unlimited concurrency
    <ts>:INFO [launcher]: Starting browser Chrome
    <ts>:INFO [Chrome 58.0.3029 (Linux 0.0.0)]: Connected on socket qfNuMyp4q3SyUBOsAAAA with id 24880742
    Chrome 58.0.3029 (Linux 0.0.0)  "before all" hook FAILED
            Error: oh no!
                at Context.before (test.js:3:11)
    Chrome 58.0.3029 (Linux 0.0.0): Executed 1 of 3 (1 FAILED) ERROR (0.013 secs / 0.001 secs)
    

    它显示“Executed 1 of 3”,因为它尝试执行第一个测试,但该尝试在 before 挂钩中失败,因此 Mocha 没有尝试运行任何后续测试。

    【讨论】:

    • 有没有办法可以在日志的每一行输出正在运行的测试的名称?所以很容易将日志与实际测试联系起来吗?
    【解决方案2】:

    您可以编辑 karma.config 以在 karma.config 文件的 jasmine 部分中添加标志“random=false”。 我在这个博客中找到了这个答案,它对我有用:https://www.miguoliang.com/how-to-fix-testing-order-in-angular-with-jasmine.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 2020-08-26
      • 1970-01-01
      • 2014-12-20
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多