我正在使用gulp-istanbul通过Gulp生成JavaScript单元测试覆盖率报告.有没有办法配置伊斯坦布尔生成我的gulp流中所有JS文件的完整覆盖率报告,而不仅仅是测试用例触及的文件.
我正在开发一个包含大量JS的项目,但没有单元测试,我们正在努力提高测试覆盖率.我希望有一个覆盖率报告,从大多数文件的0%覆盖率开始,但随着时间的推移,覆盖率将会提高.
gulp.task( 'test', function () {
gulp.src( [ my source glob ] )
.pipe( istanbul() )
.on( 'end', function () {
gulp.src( [ my test spec glob ] )
.pipe( mocha( {
reporter: 'spec'
} ) )
.pipe( istanbul.writeReports(
[ output location ]
) );
} );
} );
Run Code Online (Sandbox Code Playgroud) 有没有人设法使用Ember CLI项目获得代码覆盖率?
我已经尝试使用blanket.js和伊斯坦布尔,因为有其他在这里,这里和这里,也没有用任何的成功.我设法让每个人实际生成一份报道报告,但报告要么说是0%(伊斯坦布尔),要么是100%(blanket.js),目前的测试无法提供100%的覆盖率.
Ember CLI生成的构建项目JavaScript文件包含项目的所有源文件,每个文件的内容都输出到一行,有时是大量的行.因此,即使覆盖工具能够为构建文件中的代码生成实际覆盖度量指标,也存在查看结果的问题.上帝只知道如何将其链接回原始源文件?
Ember CLI很棒,看起来很受欢迎,所以我很惊讶更多的人没有遇到这个问题.也许其他人不会受到代码覆盖的困扰,或者大多数人只是让它在没有问题的情况下工作,而我却错过了一些东西.
在ES5中,我们可以这样写:
function(a){
/* istanbul ignore next */
a = a || 123;
}
Run Code Online (Sandbox Code Playgroud)
怎么忽略在ES6?
function(a = 123 ){
}
Run Code Online (Sandbox Code Playgroud)
我试过这个:
function(/* istanbul ignore next */a = 123 ){
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
我目前正在最后的报道中获取我的测试文件.这可能是因为它们与我的组件并排放置,而不是拥有自己的测试文件夹.如何从保险范围中排除这些?
我安装了伊斯坦布尔和纽约,我正在使用摩卡咖啡.
我的脚本看起来像:
"test": "nyc --reporter=html mocha tools/testSetup.js app/**/*.spec.js || true"
是否可以忽略E
伊斯坦布尔分支覆盖范围内的标记?我正在使用Jasmine + karma + Istanbul.是否有可能进入E
并获得100%的分支机构覆盖?也许可以在karma配置中设置的属性?
我正在用Jasmine创建一些单元测试,而我正在使用的测试运行器是Karma.我还使用karma-coverage插件检查这些测试规范的代码覆盖率.
我想知道是否有任何方法可以从代码覆盖范围本身以及Karma报告(实际上是伊斯坦布尔)中排除某些功能.我想如果第一个问题解决了,那么第二个问题就解决了.
很确定没有明显的方法可以做到这一点,因为我也在伊斯坦布尔看过(业力覆盖使用它),但也许你们中的一些人之前遇到过这种情况.
我试图弄清楚如何限制我的测试,以便覆盖记者只考虑在专门为该功能编写测试时所涵盖的功能.
PHPUnit文档中的以下示例显示了我尝试实现的非常好的内容:
可以在测试代码中使用@covers注释来指定测试方法要测试的方法:
/**
* @covers BankAccount::getBalance
*/
public function testBalanceIsInitiallyZero()
{
$this->assertEquals(0, $this->ba->getBalance());
}
Run Code Online (Sandbox Code Playgroud)
如果执行上述测试,则只将该功能getBalance
标记为已覆盖,而不是其他.
现在来自我的JavaScript测试的一些实际代码示例.此测试显示了我试图摆脱的不需要的行为:
it('Test get date range', function()
{
expect(dateService.getDateRange('2001-01-01', '2001-01-07')).toEqual(7);
});
Run Code Online (Sandbox Code Playgroud)
此测试将将函数标记getDateRange
为已覆盖,但也 标记从内部调用的任何其他函数getDateRange
.由于这个怪癖,我项目的实际代码覆盖率可能比报告的代码覆盖率低很多.
我怎么能阻止这种行为?有没有办法让Karma/Jasmine/Istanbul按照我想要的方式运行,或者我是否需要切换到另一个JavaScript测试框架?
我试图用IstanbulJS为我用TypeScript编写并经Cypress测试的代码生成代码覆盖率报告。但是事情变得不合时宜:
我专门针对此问题创建了一个git存储库 MCVE,因此您可以准确地再现我的情况:
git clone https://github.com/papb/cy-ts-istanbul-question
cd cy-ts-istanbul-question
npm install
npm test
# And then open the file `coverage/index.ts.html` to see the image above.
Run Code Online (Sandbox Code Playgroud)
如何解决?
我有一些用TypeScript编写的代码,这些代码可以通过rollup,rollup-plugin-typescript2和rollup-plugin-istanbul转换并捆绑到一个JavaScript(ES6)文件中。这非常完美,我在TypeScript中的源代码变成了一个文件,可以随<script>
标签一起包含在浏览器中并使用。
其次,我使用cypress在HTML页面上运行测试,该页面包含上述转译的JS代码。cypress也可以完美地工作,赛普拉斯能够测试我最初用TypeScript编写的函数。
现在,我想为这些测试设置覆盖率报告。在赛普拉斯常见问题解答上,我们可以找到问题是否存在代码覆盖率?目前尚无答案(关于内置功能),但正在讨论中,这是将来要做的受欢迎的事情,并且实际上可以做到。
问题是:上面的人没有使用TypeScript。我是。因此,我需要做一些额外的步骤,这就是我目前遇到的问题。凭直觉,我认为这只是配置IstanbulJS以正确遵循源映射的问题,但是我找不到有关如何执行此操作的任何文档。我所能找到的每本有关TypeScript + IstanbulJS的指南都假设我正在使用Mocha,但我不是-我正在使用Cypress和来自TypeScript的转译源。
注意:我知道一般来说,进行赛普拉斯测试的通常“代码覆盖率”方法没有多大意义,但是在我的确切情况下,我认为确实如此,我已经考虑过了,请不要制作此框架挑战这个问题。
编辑:要清楚,在这里使用汇总并不是硬性要求。如果您有使用其他解决方案的解决方案,那也是完全可以接受的。正如标题所述,重要的是Cypress + TypeScript + IstanbulJS。
我正在开发一个客户端应用程序,我在创建正确的Karma配置时遇到了麻烦.现在,我的设置如下:
Webpack:使用ts-loader,编译TypeScript,资产等.
Karma:使用webpack插件,加载Webpack配置(使用ts-loader),然后使用Jasmine + PhantomJS运行所有单元测试
单元测试所有运行正常,但我还没有找到一种方法来处理webpack istanbul重映射.Karma-webpacks似乎没有生成源映射以允许重映射发生.任何指针将不胜感激!
Karma配置:
var webpackConfig = require("./webpack.config.js");
delete webpackConfig.entry;
module.exports = function (config) {
config.set({
// base path that will be used to resolve all patterns (eg. files, exclude)
basePath: '',
// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['jasmine'],
// list of files / patterns to load in the browser
files: [
// Non-automatically bundled libraries
'app/client/js/lib/easeljs.min.js',
'app/client/js/lib/tweenjs.min.js',
// Entry File
'app/client/js/index.ts',
'app/client/html/**/*.html',
// Test files and dependencies
'node_modules/angular-mocks/angular-mocks.js',
'test/client/**/*.spec.js'
],
// preprocess …
Run Code Online (Sandbox Code Playgroud) 因此,nyc正在修改我的文件,如下所示:
at _onCreate (src/post/admin.js:1:10453)
at doQuery (src/db.js:59:216)
at process._tickCallback (internal/process/next_tick.js:68:7)
Run Code Online (Sandbox Code Playgroud)
我不确定如何使用源地图解开这个.文档说明:
使用源映射准确的堆栈跟踪.
当produce-source-map设置为true时,已检测的源文件将包含instrumenter转换的内联源映射.与源映射支持结合使用时,已检测代码的堆栈跟踪将反映其原始行.
所以我尝试了以下npm run命令:
"NODE_ENV=test nyc mocha --require ./tests/setup.js --require source-map-support/register --produce-source-map true --bail ./tests/unit/$FILE"
Run Code Online (Sandbox Code Playgroud)
结合纽约设置:
"nyc": {
"include": [
"src"
],
"exclude": [
"./tmp/**/*",
"./tests"
],
"instrument": true,
"report-dir": "./tests/coverage",
"temp-dir": "./tests/temp",
"source-map": true,
"produce-source-map": true
}
Run Code Online (Sandbox Code Playgroud)
但线路仍然受损.
istanbul ×10
javascript ×4
unit-testing ×4
mocha.js ×3
jasmine ×2
typescript ×2
babeljs ×1
blanket.js ×1
cypress ×1
ecmascript-6 ×1
ember-cli ×1
gulp ×1
karma-runner ×1
node.js ×1
nyc ×1
rollupjs ×1
webpack ×1