【发布时间】:2017-11-03 22:01:04
【问题描述】:
我正在通过 jenkins 运行 Karma 测试。 通常,当测试失败时,它会显示测试名称和测试编号,但在某些情况下,它只会显示编号。
Karma 是否按特定顺序运行测试?喜欢按字母顺序吗?
下面是我在 jenkins 上的控制台输出截图。
【问题讨论】:
标签: angular testing jenkins karma-runner
我正在通过 jenkins 运行 Karma 测试。 通常,当测试失败时,它会显示测试名称和测试编号,但在某些情况下,它只会显示编号。
Karma 是否按特定顺序运行测试?喜欢按字母顺序吗?
下面是我在 jenkins 上的控制台输出截图。
【问题讨论】:
标签: angular testing jenkins karma-runner
决定测试运行顺序的不是 Karma 本身。 主要决定测试顺序的组件是您决定与 Karma 一起使用的测试运行器。如果您使用 Mocha,那么将使用 Mocha 的逻辑。如果你使用 Jasmine,那么将使用 Jasmine 的逻辑。如果你使用其他东西,那么就会使用其他一些逻辑。
例如,Mocha 会按照在测试文件中调用 describe 和 it 的顺序运行测试。如果你有两个测试文件a.js 和b.js 和a.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 没有尝试运行任何后续测试。
【讨论】:
您可以编辑 karma.config 以在 karma.config 文件的 jasmine 部分中添加标志“random=false”。 我在这个博客中找到了这个答案,它对我有用:https://www.miguoliang.com/how-to-fix-testing-order-in-angular-with-jasmine.html
【讨论】: