打字稿的代码覆盖率

Ger*_*don 27 javascript code-coverage typescript

我们刚刚在Typescript中启动了一个项目,我们需要获得代码覆盖率数据.

我们现有的JavaScript项目使用Grunt中的Instanbul进行覆盖.我们不确定如何为TypeScript复制它.

是否有任何工具可以从TypeScript代码本身生成代码覆盖?或者我们是否针对生成的JavaScript代码运行Istanbul(或类似)工具.

Rya*_*ugh 20

在TypeScript团队中,我们只在编译的JavaScript上使用常规代码覆盖工具.我们发现这已经足够了,因为通常对于代码覆盖率,您正在考虑总覆盖率%(不会发生显着变化)或者在表达级别深度潜水(这也没有显着变化).

如果您找到了支持它的工具(我还没有意识到),理论上您可以使用编译器发出的源映射将coverage数据映射回TypeScript代码.这可能不值得麻烦.

  • 我们开始使用该方法,但是当使用具有相同前缀的模块:myApp.directives和myApp.services时,生成的JS代码以未涵盖的行结束:(myApp ||(myApp = {})); 您是否找到了解决方法,因此这些分支在覆盖率报告中未标记为"未涵盖"? (2认同)
  • https://www.npmjs.com/package/istanbul-coverage-source-map (2认同)
  • 不幸的是,当您通过“ts-node”对 Typescript 源进行测试时,这种方法不起作用;渴望为此找到一些解决方案。 (2认同)

McM*_*ath 20

更新:2016年8月

现在可以使用Istanbul v1(当前处于alpha阶段)以及TypeScript节点针对TypeScript源代码运行Istanbul .

以下假设您使用Mocha作为测试框架,并且所有测试代码都在标准test/目录下.

首先,安装必需的包:

npm install --save-dev mocha ts-node
npm install --save-dev --save-exact istanbul@1.1.0-alpha.1
Run Code Online (Sandbox Code Playgroud)

然后在您的内容中包含以下内容package.json:

"scripts": {
   "test": "istanbul cover -e .ts _mocha -- --compilers ts:ts-node/register"
}
Run Code Online (Sandbox Code Playgroud)

而已.跑npm test,你会被覆盖.

有关一个工作示例,请参阅我的Deep Map项目,其中测试文件与源代码保存在同一目录中.以下是HTML输出的示例:

深度地图覆盖

  • 我们如何与Karma一起做这件事? (3认同)
  • @ShaunLuttin我预计有人会问起Karma.我不知道,但我会调查并相应地更新我的答案. (3认同)

Jes*_*sen 13

这个问题最初发布两年后,现在remap-istanbul看起来很有希望.

您可以在Sitepen中阅读有关它的更多信息:TypeScript和其他透明语言的代码覆盖率

正如他们在Github项目中所写:

一个软件包,可以根据JavaScript Source Maps v3将Istanbul代码覆盖率信息重新映射到其原始源位置.

当我阅读文档时,项目将根据源图将您的伊斯坦布尔生成的覆盖作为转换输入.这听起来像是一个额外的步骤,但我相信它会有所帮助,以便您可以在覆盖率报告中摆脱那些已转换的自动生成的行.

我相信这正是你所需要的.


Twi*_*ron 8

针对生成的javascript运行代码覆盖率.你甚至可以通过告诉伊斯坦布尔忽略打字稿所写的那些令人讨厌的不可接听的行来达到100%的覆盖率.

伊斯坦布尔尊重/*istanbul忽略下一个*/的评论,所以我所做的是在我的gulp任务中运行一个字符串替换,将istanbul忽略注释注入到TypeScript写入的自动生成的包装器代码中.

这是gulp任务:

var gulp = require('gulp'),
    replace = require('gulp-replace'),
    ts = require('gulp-typescript'),

gulp.task('scripts', function () {
    //compile typescript into javascript
    gulp.src('src/**/*.ts')
        .pipe(ts({
            declarationFiles: false,
            removeComments: false
        }))

        //write comments to tell istanbul to ignore the code inside the iife parameters
        .js.pipe(replace(/(}\)\()(.*\|\|.*;)/g, '$1/* istanbul ignore next */$2'))

        //write comments to tell istanbul to ignore the extends code that typescript generates
        .pipe(replace(/(var __extends = \(this && this.__extends\))/g, '$1/* istanbul ignore next */'))

        //write all of the compiled javascript files to a build folder so we can use them for tests and coverage
        .pipe(gulp.dest('dist/src'))

        //...the rest of your build process
});
Run Code Online (Sandbox Code Playgroud)

这是生成的代码.

var __extends = (this && this.__extends)/* istanbul ignore next */ || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};
var animalApi;
(function (animalApi) {
    var dogs;
    (function (dogs) {
        var BlackLab = (function (_super) {
            __extends(BlackLab, _super);
            //class code...
        });
        dogs.BlackLab = BlackLab;
    })(/* istanbul ignore next */dogs = animalApi.dogs || (animalApi.dogs = {}));
})(/* istanbul ignore next */animalApi || (animalApi = {}));
Run Code Online (Sandbox Code Playgroud)


jfo*_*ira 7

您可以使用放肆

使用Chutzpah,您可以从命令行运行测试,并将您的测试与Visual Studio Test Explorer集成.

Chutzpah允许您决定是否要从.ts文件,.js文件,.html文件或所有文件运行测试.

设置(在Visual Studio/Tools/Options/Chutzpah中)从.ts文件运行测试时,您将能够分析生成的.js文件的代码覆盖率,并在生成的JavaScript代码和.ts文件之间建立链接.生成它.

它可以很容易地处理你的TypeScript代码覆盖,即使是JavaScript代码也是真正的测试代码.

您可以从Visual Studio/Tools/Extensions和更新安装Chutzpah.

您可以在这里找到有关使用Chutzpah进行代码覆盖的更多详细信息.

  • Chutzpah似乎仅适用于Visual Studio.TypeScript不是. (6认同)