gpt4 book ai didi

javascript - 如何使用 Grunt 和 Mocha 按 mtime 顺序运行单元测试

转载 作者:行者123 更新时间:2023-12-01 02:55:52 26 4
gpt4 key购买 nike

那么,当您进行 TDD 时,您是否会等待它运行所有测试,直到您正在处理的测试为止?这需要太多时间。当我很着急时,我将测试文件重命名为 aaaaaaaaaaaaaaaa_testsomething.test.js 之类的名称,这样它就会首先运行,我会尽快看到错误。

我不喜欢这种方法,我确信有解决方案,但我找不到。那么使用 Mocha 按 mtime 顺序运行单元测试的最简单方法是什么?有 -sort 选项,但它仅按名称对文件进行排序。如何按修改时间对它们进行排序?

这是我的 Gruntfile.js:

module.exports = function(grunt) {

grunt.initConfig({
watch: {
tests: {
files: ['**/*.js', '!**/node_modules/**'],
tasks: ['mochacli:local']
}
},
mochacli: {
options: {
require: ['assert'],
reporter: 'spec',
bail: true,
timeout: 6000,
sort: true,
files: ['tests/*.js']
},
local: {
timeout: 25000
}
}
});


grunt.loadNpmTasks('grunt-mocha-cli');
grunt.loadNpmTasks('grunt-contrib-watch');

grunt.registerTask('test', ['mochacli:local']);
grunt.registerTask('livetests', [ 'watch:tests']);

};

注意:它不重复。我不想每次保存源代码文件时都编辑我的测试或 Gruntfile.js。我询问如何修改 Grunt 任务,以便它首先从上次修改的 *.test.js 文件运行测试。按 mtime 对单元测试进行排序,如标题中所述。

简单场景:我在编辑器中打开 test1.test.js,更改它,按 Ctrl+B,然后它从 test1.test.js 然后 test4.test.js 运行单元测试。我打开 test4.test.js,按 Ctrl+S、Ctrl+B,它从 test4.test.js 然后运行 ​​test1.test.js

我正在考虑一些 Grunt 插件来首先对文件进行排序,这样我就可以将其结果放在“tests/*.js”中,并使用 grunt.config.set('mochacli.options.files', 'tests/recent.js,tests/older.js', ....); 但我找不到任何可以用作中间件的东西,我确信不想发明自行车已经为此实现了一些东西。

最佳答案

don't want to invent bicycle as I'm sure there's something for this implemented already.

...有时你必须骑自行车;)

<小时/>

解决方案

这可以通过注册中间体 custom-task 来实现在您的 Gruntfile.js 中动态执行以下操作:

  1. 利用 grunt.file.expand 获取所有单元测试文件 (.js) 的文件路径与适当的globbing模式。
  2. 按文件 mtime 对每个匹配的文件路径进行排序/修改日期。
  3. 使用 grunt.config 配置具有按时间顺序排序的文件路径的 mochacli.options.file 数组
  4. 运行本地 Target使用 grunt.task.runmochacli 任务中定义
<小时/>

Gruntfile.js

按如下方式配置您的 Gruntfile.js:

module.exports = function(grunt) {

// Additional built-in node module.
var statSync = require('fs').statSync;

grunt.initConfig({
watch: {
tests: {
files: ['**/*.js', '!**/node_modules/**', '!Gruntfile.js'],
tasks: ['runMochaTests']
}
},
mochacli: {
options: {
require: ['assert'],
reporter: 'spec',
bail: true,
timeout: 6000,
files: [] // <-- Intentionally empty, to be generated dynamically.
},
local: {
timeout: 25000
}
}
});

grunt.loadNpmTasks('grunt-mocha-cli');
grunt.loadNpmTasks('grunt-contrib-watch');

/**
* Custom task to dynamically configure the `mochacli.options.files` Array.
* All filepaths that match the given globbing pattern(s), which is specified
# via the `grunt.file.expand` method, will be sorted chronologically via each
* file(s) latest modified date (i.e. mtime).
*/
grunt.registerTask('runMochaTests', function configMochaTask() {
var sortedPaths = grunt.file.expand({ filter: 'isFile' }, 'tests/**/*.js')
.map(function(filePath) {
return {
fpath: filePath,
modtime: statSync(filePath).mtime.getTime()
}
})
.sort(function (a, b) {
return a.modtime - b.modtime;
})
.map(function (info) {
return info.fpath;
})
.reverse();

grunt.config('mochacli.options.files', sortedPaths);
grunt.task.run(['mochacli:local']);
});

grunt.registerTask('test', ['runMochaTests']);
grunt.registerTask('livetests', [ 'watch:tests']);

};
<小时/>

附加说明

使用上面的配置。通过 CLI 运行 $ grunt livetests ,然后保存修改后的测试文件将导致 Mocha 根据文件上次修改日期按时间顺序运行每个测试文件(即最近修改的文件将首先运行,最后修改的文件将最后运行)。运行 $ grunt test 时也适用相同的逻辑。

但是,如果您希望 Mocha 首先运行最近修改的文件,然后按正常顺序(即按名称)运行其他文件,则自定义 runMochaTests上面的 Gruntfile.js 中的任务应替换为以下逻辑:

/**
* Custom task to dynamically configure the `mochacli.options.files` Array.
* The filepaths that match the given globbing pattern(s), which is specified
# via the `grunt.file.expand` method, will be in normal sort order (by name).
* However, the most recently modified file will be repositioned as the first
* item in the `filePaths` Array (0-index position).
*/
grunt.registerTask('runMochaTests', function configMochaTask() {
var filePaths = grunt.file.expand({ filter: 'isFile' }, 'tests/**/*.js')
.map(function(filePath) {
return filePath
});

var latestModifiedFilePath = filePaths.map(function(filePath) {
return {
fpath: filePath,
modtime: statSync(filePath).mtime.getTime()
}
})
.sort(function (a, b) {
return a.modtime - b.modtime;
})
.map(function (info) {
return info.fpath;
})
.reverse()[0];

filePaths.splice(filePaths.indexOf(latestModifiedFilePath), 1);
filePaths.unshift(latestModifiedFilePath);

grunt.config('mochacli.options.files', filePaths);
grunt.task.run(['mochacli:local']);
});

关于javascript - 如何使用 Grunt 和 Mocha 按 mtime 顺序运行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46718669/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com