Karma 运行 以什么顺序进行测试?

In what order does Karma run its tests?

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

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

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

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

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

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

更复杂的是,如果某些测试 运行 人员确定您的 测试套件 是,他们将中止测试 运行 buggy. 这不会改变测试的顺序,但可能会使它看起来像缺少测试。例如,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 没有尝试 运行 任何后来的测试。

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