本应用结合 lcov.info
与 Git Diff
得到仓库的增量覆盖率数据。
Incremental Coverage 适用于 macOS、Windows 和 Linux。
如果 Incremental Coverage 不能正常工作,请提交 issue。
$ npm install incremental-coverage
# or
$ yarn add incremental-coverage
const fs = require('fs');
const { getIncrease, getFull } = require('incremental-coverage');
(async () => {
// 增量覆盖率,支持合并多个 lcov 文件
const res1 = await getIncrease(
'./e2e/coverage/lcov.info',
{
output: true,
stream: {
name: 'file',
},
}
);
fs.writeFileSync('./output1.json', JSON.stringify(res1, null, 2));
// 全量覆盖率,可以支持合并多个 lcov 文件
const res2 = await getFull([
'./e2e/coverage/lcov.info',
'./coverage/lcov.info',
]);
fs.writeFileSync('./output2.json', JSON.stringify(res2, null, 2));
})();
我们通过一个简单的命令行工具来展示如何使用(必须在 Git 仓库根目录中运行,且指定 lcov 文件)。
$ incremental-coverage -p="./.dwt_output/e2e/coverage/lcov.info" -t="2020-06-01"
- 上面这条命令指定
./.dwt_output/e2e/coverage/lcov.info
覆盖率文件 - 并且指定了
2020-06-01
增量起始时间 - 运行这个命令将会在根目录输出一个
output.json
文件,文件示例如下:
{
"data": {
"total": { "increLine": 3, "covLine": 3, "increRate": "100.00%" },
"files": [
{
"increLine": 1,
"covLine": 1,
"increRate": "100.00%",
"detail": [{ "number": 2, "hits": 73 }],
"name": "./src/components/index.js"
}
]
},
"commit": {
"status": ["M"],
"files": [".gitlab-ci.yml"],
"abbrevHash": "26e3b93",
"hash": "26e3b931cf165b73902e404d3adaaef973ac4609",
"subject": "refactor: 临时注释tde的调试代码",
"authorName": "helinjiang",
"authorDate": "2020-07-31 09:55:35 +0800"
},
"createInfo": {
"hash": "cc4f1e2f18a49cd8a30de0cb5087a709979c4631",
"abbrevHash": "cc4f1e2",
"authorName": "helinjiang",
"authorEmail": "helinjiang@**.com",
"authorDate": "Mon Apr 1 14:43:54 2019 +0800",
"subject": "feat: init"
}
}
data
中total
为增量覆盖率的总情况,files
中是各个文件的详细情况commit
为当前正在对比的那次提交的信息createInfo
是 git 仓库的创建信息
提供
命令行
与Node.js
调用两种形式
CLI 没有子命令只有最简单的三个选项:
--path、-p
:指定 lcov.info 文件的路径--time、-t
:执行增量计算的开始时间(建议不要太长)--output、-o
:结果的输出方式,可以选择file 与 stdio
,默认为 file
Incremental Coverage 对外暴露两个 API 与三个 Parser
path
:string
或者string[]
,lcov.info 文件的路径opts
:配置选项cwd
:String
,git 命令运行的路径since
:String
,增量起始计算时间output
:Boolean
,是否需要输出stream
:Object
,针对输出流的配置name
:file 或者 stdioopts
:包含type
输出格式,可选json
、yaml
;filePath
(name 为 file 时生效)指定输出文件路径;ioType
(name 为 stdio 时生效),可选 stdout、stderr
格式化后的数据,与上面的示例文件保持一致
...args: string[]
:lcov.info 文件路径
合并之后的数据
console.log(lcovParser(lcov1, lcov2));
export declare class DiffParser implements Parser {
constructor(hash: string, opt?: child.ExecOptions);
run(): Promise<File[]>;
}
hash
:需要进行 Diff 的 Commit IDopt
:与子进程接受的参数相同可以 参考File
:本数据结构如下(使用 gitdiff-parser)
export interface Change {
content: string;
type: 'insert' | 'delete' | 'normal';
isInsert?: boolean;
isDelete?: boolean;
isNormal?: boolean;
lineNumber?: number;
oldLineNumber?: number;
newLineNumber?: number;
}
export interface Hunk {
content: string;
oldStart: number;
newStart: number;
oldLines: number;
newLines: number;
changes: Change[];
}
export interface File {
hunks: Hunk[];
oldEndingNewLine: boolean;
newEndingNewLine: boolean;
oldMode: string;
newMode: string;
similarity?: number;
oldRevision: string;
newRevision: string;
oldPath: string;
newPath: string;
isBinary?: boolean;
type: 'add' | 'delete' | 'modify' | 'rename';
}
export declare class LogParser implements Parser {
constructor(opt?: GitlogOptions);
run(): Promise<
(Record<'abbrevHash' | 'hash' | 'subject' | 'authorName' | 'authorDate' | 'status', string> & {
files: string[];
})[]
>;
}
opt
以及返回数据都可以 参考
export declare class LcovParser implements Parser {
constructor(path: string);
run(): Promise<Info>;
}
path
:lcov 文件的路径Info
:格式化之后的数据,如下
// 覆盖率测试报告格式化数据结构
export interface Total {
linesCovered: number;
linesValid: number;
}
export interface DetailLines {
lineRate: number;
lines: {
branch: string;
hits: number;
number: string;
}[];
}
export interface Lcov {
detail: Record<string, DetailLines>;
$?: Total;
}
Incremental Coverage 使用 MIT 开源协议。