如何获得业力覆盖率(伊斯坦布尔)来检查所有源文件的覆盖率?
Posted
技术标签:
【中文标题】如何获得业力覆盖率(伊斯坦布尔)来检查所有源文件的覆盖率?【英文标题】:How to get karma-coverage (istanbul) to check coverage of ALL source files? 【发布时间】:2014-07-11 20:56:52 【问题描述】:代码结构
我有一个类似app
的目录结构
scripts/sequoia/
├── GraphToolbar.js
├── nodes
│ ├── activityNode.js
│ └── annotationNode.js
├── OverviewCanvasControl.js
└── settings
├── GraphControlSettingsFactory.js
└── SnapContextFactory.js
我的test
目录当前看起来是这样的
test/spec/
├── GraphToolbarSpec.js
├── settings
│ ├── graphControlSettingsFactorySpec.js
│ └── snapContextFactorySpec.js
└── test-main.js
请注意,到目前为止,我只有 GraphToolbar
和 settings/
文件; OverviewCanvasControl.js
或 nodes/
文件还没有测试。
业力配置
在我的karma.conf.js
中(coverage
指的是karma-coverage
):
preprocessors:
'scripts/sequoia/**/*.js': ['coverage']
,
reporters: ['progress','coverage'],
问题
当我运行 karma 时,覆盖预处理器和报告器会运行,但它只检查已经编写了规范的文件。我想报告 OverviewCanvasControl.js
和没有覆盖率的 nodes/
文件的 0% 覆盖率。当创建一个新文件并运行 karma 时,我希望它能够捕捉到该文件还没有规范。
如何让 Karma 检查所有匹配的源文件的覆盖率,而不仅仅是那些已经创建规范的源文件?
【问题讨论】:
我也有同样的问题。我想让伊斯坦布尔说,“这个代码被测试覆盖了 x%”,而不是“测试覆盖了这个代码的 x%”。看到您的百分比很高,实际上它忽略了整个文件,这是一种误导。 【参考方案1】:在搜索了我之后,我发现这很容易。将此添加到您的 karma.conf.js:
coverageReporter:
includeAllSources: true,
reporters: [
...
]
BR 克里斯
【讨论】:
效果很好!这是文档:github.com/karma-runner/karma-coverage/blob/master/docs/…【参考方案2】:我一直在努力解决这个问题,但我找到了一个很好的解决方案。
在执行测试之前,我会执行一个任务,该任务将遍历您的 js 文件并在单个规范文件中要求它们。这将使文件被检测并正确生成代码覆盖率。由于伊斯坦布尔仅检测规范所需的文件。 显示您的规格而不是您的代码的覆盖率。这将解决此问题。
它的灵感来自于红杉 mcdowell 的回应,我希望它对其他人有所帮助。
http://shared-mind.tumblr.com/post/89641439478/istanbul-code-coverage-force-instrumentation-of-all-file
【讨论】:
【参考方案3】:我想出的解决方案:遍历源代码树并检查每个源 JS 文件是否存在规范文件。这假设每个源文件都有一个对应的Spec.js
文件(位于对应的目录结构中)。
app/scripts/moduleFoo.js
→ test/spec/moduleFooSpec.js
app/scripts/ns1/Utils/foo_bar.js
→test/spec/ns1/Utils/foo_barSpec.js
任务依赖于fs-tools npm 模块。
var fsTools = require('fs-tools');
//... module.exports = function(grunt) ... etc. (gruntfile setup)
grunt.registerTask('checkspecs', 'ensure that all js files have Specs', function()
var done = this.async();
var srcPath = './'+cfg.app+'/scripts/'; //Where are your scripts?
var testPath = './test/spec/'; //Where are your specs?
var missingSpecs = [];
fsTools.walk(srcPath, '.js$', function(path,stats,callback)
var specPath = testPath + path.substring(path.indexOf('ptc')+4);
//strip .js, add Spec.js
specPath = specPath.split('').slice(0,-3).join('') + 'Spec.js';
if(!grunt.file.exists(specPath))
missingSpecs.push(path);
callback();
, function (err)
if(err)
grunt.log.error(err);
done(false);
if(missingSpecs.length > 0)
grunt.log.warn('`Spec.js` files are missing for the following files!!');
missingSpecs.forEach(function(path)
grunt.log.warn(path);
);
else
grunt.log.ok('Spec files present for all source files');
done(!err); //fail only if fsTools.walk throws
//done(!missingSpecs.length); //fail if any specs are "missing"
);
);
为什么不把它打包成一个 grunt 任务并发布到 NPM?
主要是因为它在很大程度上依赖于您的项目中的特定路径和命名约定。它还没有排除目录/文件(这可能是必要的)&如果你不这样做 *Spec.js
它不会工作。在我看来,接受这个 sn-p 并对其进行自定义可能比将所有内容外部化并使其成为可配置的任务更容易。以后可能会改变这个。 ?
【讨论】:
我会等几周看看是否有更好的答案,然后再接受。 每个人都喜欢我的问题,但没有人喜欢我的回答。 ? 对不起,现在没有更简单的方法了。 嗯,我应该写一个不依赖 grnt 的版本......也许是一个通用的 speccer-checker。 我喜欢你的回答,并为 grunt 用户制作了一个简单的插件。npmjs.com/package/grunt-spec-check(我希望在某个阶段它会被 karma 中的功能所取代,但这是一个快速的胜利)以上是关于如何获得业力覆盖率(伊斯坦布尔)来检查所有源文件的覆盖率?的主要内容,如果未能解决你的问题,请参考以下文章
具有线路覆盖率和最小限制的 Pytest 覆盖率,如业力/伊斯坦布尔
伊斯坦布尔仪器加载程序找不到 Angular2 组件的源映射。