我正在通过jenkins运行Karma测试,通常当一个测试失败时,它会显示测试名称和测试编号,但在某些情况下,它只显示编号。卡玛的测试是按特定顺序进行的吗,比如字母顺序?下面是我在jenkins上的控制台输出截图。
bogh5gae1#
Karma本身并不决定测试运行的顺序。**主要决定测试顺序的组件是您决定与Karma一起使用的测试运行程序。**如果您使用Mocha,则将使用Mocha的逻辑。如果您使用Jasmine,则将使用Jasmine的逻辑。如果您使用其他组件,则将使用其他一些逻辑。例如,Mocha按照测试文件中调用describe和it的顺序运行测试。如果您有两个测试文件a.js和b.js,并且先执行a.js,则Mocha将先运行a.js中的测试。如果先执行b.js,那么Mocha将首先在b.js中运行测试。Mocha不会执行进一步的排序。(摩卡有一个sort选项,但它仅在使用mocha命令行工具在Node中运行Mocha时有用。它不适用于在Karma中使用Mocha,因为Karma运行Mocha *在浏览器 * 中,其中Mocha不支持sort。)
describe
it
a.js
b.js
sort
mocha
**如果使用模块加载程序(如RequireJS或SystemJS)来动态加载测试文件,这会使事情复杂化。**如果您执行require(["a", "b"]),并且两个模块彼此不依赖,则它们加载的顺序是不确定的。a可能会先加载,或者b可能会先加载,因此测试的运行顺序可能会在不同的运行中不一致。您可以通过配置或嵌套require调用来强制执行顺序。(例如,再次假设模块彼此不依赖,require(["a"], () => require("b"))确保a中的测试将在b中的测试之前执行。)**更复杂的情况是,如果某些测试运行者确定您的 * 测试套件 * 存在错误,他们将中止测试运行。**这不会更改测试的顺序,但可能会使测试看起来像是丢失了测试。例如,Mocha考虑用于设置和删除测试数据的挂接中的错误(通过反对测试本身的错误)是测试套件中的错误,并将中止运行。如果您的三个测试依赖于失败的安装代码,Mocha将跳过这些测试。您将看到三个测试中有一个失败,下面是一个示例测试文件,其中包含3个测试和before钩子中的一个失败。(before钩子,又名“before all”,用于在一组测试之前设置测试数据。)
require(["a", "b"])
a
b
require
require(["a"], () => require("b"))
before
before(() => { throw new Error("oh no!"); }); it("one", () => {}); it("two", () => {}); it("three", () => {});
下面是我的karma.conf.js:
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>
<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没有尝试运行任何后续测试。
2wnc66cl2#
你可以编辑karma.config文件,在karma.config文件的jasmine部分添加一个'random=false'标志。我在这个博客中找到了这个答案,它对我很有效:https://www.miguoliang.com/how-to-fix-testing-order-in-angular-with-jasmine.html
niwlg2el3#
上面的答案在使用jasmine的情况下也是正确的。url不再工作,编辑是不可能的,所以这里是一小部分代码作为答案:在karma.conf.js中添加以下行(如果密钥jasmine已经存在,则编辑并添加random):
client: { jasmine: { random: false }, };
3条答案
按热度按时间bogh5gae1#
Karma本身并不决定测试运行的顺序。**主要决定测试顺序的组件是您决定与Karma一起使用的测试运行程序。**如果您使用Mocha,则将使用Mocha的逻辑。如果您使用Jasmine,则将使用Jasmine的逻辑。如果您使用其他组件,则将使用其他一些逻辑。
例如,Mocha按照测试文件中调用
describe
和it
的顺序运行测试。如果您有两个测试文件a.js
和b.js
,并且先执行a.js
,则Mocha将先运行a.js
中的测试。如果先执行b.js
,那么Mocha将首先在b.js
中运行测试。Mocha不会执行进一步的排序。(摩卡有一个sort
选项,但它仅在使用mocha
命令行工具在Node中运行Mocha时有用。它不适用于在Karma中使用Mocha,因为Karma运行Mocha *在浏览器 * 中,其中Mocha不支持sort
。)**如果使用模块加载程序(如RequireJS或SystemJS)来动态加载测试文件,这会使事情复杂化。**如果您执行
require(["a", "b"])
,并且两个模块彼此不依赖,则它们加载的顺序是不确定的。a
可能会先加载,或者b
可能会先加载,因此测试的运行顺序可能会在不同的运行中不一致。您可以通过配置或嵌套require
调用来强制执行顺序。(例如,再次假设模块彼此不依赖,require(["a"], () => require("b"))
确保a
中的测试将在b
中的测试之前执行。)**更复杂的情况是,如果某些测试运行者确定您的 * 测试套件 * 存在错误,他们将中止测试运行。**这不会更改测试的顺序,但可能会使测试看起来像是丢失了测试。例如,Mocha考虑用于设置和删除测试数据的挂接中的错误(通过反对测试本身的错误)是测试套件中的错误,并将中止运行。如果您的三个测试依赖于失败的安装代码,Mocha将跳过这些测试。您将看到三个测试中有一个失败,下面是一个示例测试文件,其中包含3个测试和
before
钩子中的一个失败。(before
钩子,又名“before all”,用于在一组测试之前设置测试数据。)下面是我的
karma.conf.js
:下面是输出(我用
<ts>
替换了时间戳):它显示为“Executed 1 of 3”,因为它尝试执行第一个测试,但在
before
钩子中失败,因此Mocha没有尝试运行任何后续测试。2wnc66cl2#
你可以编辑karma.config文件,在karma.config文件的jasmine部分添加一个'random=false'标志。我在这个博客中找到了这个答案,它对我很有效:https://www.miguoliang.com/how-to-fix-testing-order-in-angular-with-jasmine.html
niwlg2el3#
上面的答案在使用jasmine的情况下也是正确的。url不再工作,编辑是不可能的,所以这里是一小部分代码作为答案:
在karma.conf.js中添加以下行(如果密钥jasmine已经存在,则编辑并添加random):