【发布时间】:2014-12-23 13:35:58
【问题描述】:
我已经正确设置了业力配置,配置文件,在后台运行,非常棒。一旦我更改并保存文件,它就会重新运行测试......所有 750 个单元测试。我希望能够运行一些。除了手动修改配置文件或注释掉多个文件中的数百个测试,有什么简单的方法吗?
例如当使用 mocha 运行命令行服务器测试时,我只使用正则表达式:mocha -g 'only tests that I want'。使调试和快速检查变得更加容易。
【问题讨论】:
我已经正确设置了业力配置,配置文件,在后台运行,非常棒。一旦我更改并保存文件,它就会重新运行测试......所有 750 个单元测试。我希望能够运行一些。除了手动修改配置文件或注释掉多个文件中的数百个测试,有什么简单的方法吗?
例如当使用 mocha 运行命令行服务器测试时,我只使用正则表达式:mocha -g 'only tests that I want'。使调试和快速检查变得更加容易。
【问题讨论】:
有不同的方法来做到这一点。
使用--grep 选项。这样做的缺点是所有测试都在运行特定的测试套件之前进行了预处理。
使用.only 方法。缺点和没有一样。 1. 使用 1 和 2 方法,我的节点进程经常崩溃,经常说内存不足。
限制要处理的文件选项。这速度超级快。
将预处理限制为特定文件夹,例如 Unit 或 Integration 文件夹。
为此,我使用了自定义 cli 选项 --only 并在 karma 配置中
const modules = config.only;
在文件模式中
files: typeof modules === 'string ? '[`tests/**/${module}/**/*.(test|spec).js`]: 'tests/**/*.(test|spec).js'
优点:开发人员通过在预处理阶段进行限制,可以更快地进行小改动时,只能运行某些测试。
您也可以使用 no.3 和 no.1 或 2 的组合。
【讨论】:
1) 在您的 karma.conf.js 中从终端获取参数:
var files = (process.env.npm_config_single_file) ? process.env.npm_config_single_file : 'test/test_index.js';
2) 为了运行单个测试,您需要使用所有配置设置一个选项对象(不包括文件和预处理器):
var option = {
webpack: {
// webpack configuration
},
// more configuration......
};
3) 设置文件路径和预处理器:
option.files = [
{pattern: files, watch: false}
];
option.preprocessors = {};
option.preprocessors[files] = [ 'webpack', 'sourcemap' ];
// call config.set function
config.set(option);
4) 在终端中运行:
npm test --single_file=**/my-specific-file-spec.js
有关更多信息,请查看此 PR: https://github.com/webpack/karma-webpack/pull/178
【讨论】:
在这里可以提供帮助的一个不错的扩展是 karma-jasmine-html-reporter-livereload https://www.npmjs.com/package/karma-jasmine-html-reporter-livereload
或 karma-jasmine-html-reporter https://www.npmjs.com/package/karma-jasmine-html-reporter?__hstc=72727564.86845f057bb4d741f59d578059e30644.1443860954685.1453095135802.1453138187458.37&__hssc=72727564.1.1453138187458&__hsfp=2285154675
它会创建一个调试页面,您可以在其中单独运行每个测试。对于大型项目非常有用!
【讨论】:
我有同样的问题,这是我对 karma.conf.js 稍作改动的解决方法。 实际上,从命令行获取一个参数并修改“文件”中的模式。 我使用minimist 来解析参数列表。
在配置文件中:
/* Begin */
var minimist = require('minimist');
var argv = minimist(process.argv);
var testBase="test/unit";
var testExt=".spec.js";
var unitTestPattern = testBase+'/**/*'+testExt;
if ("test" in argv){
unitTestPattern = testBase+"/"+argv["test"]+testExt;
}
/* End */
module.exports = function(config){
config.set({
//....
files : [
//....
unitTestPattern, //place here
// 'test/unit/**/*.spec.js', //replace this
//....
],
//....
});
};
在命令提示符下运行:
karma start test/karma.conf.js --single-run --test #TEST_CASE_FILE#
【讨论】:
所以现在我觉得自己很愚蠢。 mocha 支持非常窄的正则表达式匹配。
这会运行所有测试
describe('all tests',function(){
describe('first tests',function(){
});
describe('second tests',function(){
});
});
这只是运行“第一次测试”
describe('all tests',function(){
describe.only('first tests',function(){
});
describe('second tests',function(){
});
});
你也可以it.only()
我应该注意到这一点。叹息。
【讨论】:
不幸的是,您可以在 karma 启动时执行此操作,而不是在运行时执行此操作。 如果你想动态改变它,你必须付出更多的努力。
假设您想从一开始就专注于特定的测试集/套件,在 karma-mocha plugin page 上,有这个 sn-p 代码可以做您想做的事情:
module.exports = function(config) {
config.set({
// karma configuration here
...
// this is a mocha configuration object
client: {
// The pattern string will be passed to mocha
args: ['--grep', '<pattern>'],
...
}
});
};
为了使 <pattern> 参数化,您必须将配置文件包装在 Configurator 中,该配置文件将侦听 CLI 并为您自定义业力配置。
看看this SO answer 了解如何设置一个非常简单的配置器。
【讨论】:
mocha -g 'some expression'。但是 karma 需要一些时间来启动并自动重新运行。我希望能够有一些文件,我可以在其中包含我刚刚更改它的位置,它会自动拾取它。有什么想法吗?