sinkcup / coverage-badge

create badge from test coverage reports
https://www.npmjs.com/package/test-coverage-badge
MIT License
0 stars 0 forks source link

测试覆盖率徽标生成器 #1

Open sinkcup opened 3 years ago

sinkcup commented 3 years ago

用户故事:作为 CODING.net 用户,由于 codecov.io 不支持, 需要一个测试覆盖率徽标生成器,自行生成徽标, 才能在 README 里展示。

本来想和之前的项目一样用 shell 写:https://github.com/sinkcup/magic-version 但 shell 包仓库属于非主流,不如 npm、pip,也不如 apt、brew 所以在 npm、pip 中挑一个,那还是 npm 吧,毕竟 nodejs 还可以做前端,对我更实用。

sinkcup commented 3 years ago

Google 和 npm 搜索一下,看看是否有现成的:

https://github.com/codacy/coverage-parser https://www.npmjs.com/package/@connectis/coverage-parser

但都不维护了,而且用的解析器,只解析了文件,而没解析 行覆盖率……

JaCoCo:

image

const coverageParser = require('@connectis/coverage-parser');

coverageParser
    .parseFile('../java-api/build/reports/jacoco/test/jacocoTestReport.xml', {
        type: 'jacoco'
    })
    .then(results => console.log(results));

image

PHPUnit clover:

image

var clover = require("@cvrg-report/clover-json");

// Parse by file path
clover.parseFile("../test/data/phpunit/coverage.xml")
    .then(function (result) {
        console.log(JSON.stringify(result));
    }).catch(function (err) {
        console.error(err);
    });

image

sinkcup commented 3 years ago

考虑到项目名称的准确性、传播效果,决定不叫「coverage parser」,而叫「coverage badge」。

主要目的是:生成徽标,当然也顺带可以输出文字。

TODO:能否在「生成徽标时」提示安装依赖 svg,而「输出文字」不依赖 svg?

sinkcup commented 3 years ago

做了第一个功能:解析 jacoco 覆盖率 #2

发布时报错:

$ npm publish
npm ERR! package.json requires a valid "version" field

真奇怪,npm 竟然要求 hard code 版本号,而不是像 composer 那样用 git tag.

加了 version 以后,报错 403

打开发现有一个古老的包占用了这个名字 https://www.npmjs.com/package/coverage-badge

sinkcup commented 3 years ago

造个词 coverbadge,也被占用了 https://www.npmjs.com/package/coverbadge

难道要用个人冠名的包?比如 sinkcup/coverage-badge,和 composer 一样,也算合理。但我的 npm 账号 sinkcup 登不上了,找回密码也不知道发到了哪个邮箱(从产品角度说,这时候显示邮箱,进行部分隐藏,是个好体验)。给官方发了邮件,等结果。

sinkcup commented 3 years ago

等不急了,改名:https://www.npmjs.com/package/coverage-badge-cli

发布了 beta

现在做生成图片的功能 #3

能否直接使用刚才发现的那个包? https://www.npmjs.com/package/coverage-badge

无法安装, 8 年没维护了,而且排列方式是:数字在左,和目前主流的「数字在右」不一样。

image image

不过这倒启发了我:图片可以内置,但也允许用户自定义。

还有:可选输出 svg 或 png

sinkcup commented 3 years ago

做好了图片功能,想到一个问题:npm package 不能叫 xxx-cli 因为包是可以被两种方式使用的:import 或 cli 所以改名叫做 https://www.npmjs.com/package/test-coverage-badge

sinkcup commented 3 years ago

偶然发现 codecov 的不同覆盖率徽标颜色不一样,优先级不高,有时间可以做 #4

优先做 PHPUnit 格式解析 #5

sinkcup commented 3 years ago

发现图片尺寸调整导致的 bug:实际宽度没变,而是透明了。#8

image

image

sinkcup commented 3 years ago

决定先暂停需求开发,引入 代码规范 #9 、单元测试 #10 ,走合并请求,要不然有辱「敏捷开发者」名誉。

装了下 eslint,发现错误数量惊人……修了一部分,还剩几个,js 真是不熟啊……叫人!

image

sinkcup commented 3 years ago

在修复 eslint 的过程中,查了下 CommonJS 和 ES6 的区别 https://zhuanlan.zhihu.com/p/113009496

2019.11.21 Node.js v13.2 默认打开了 ES6 Module 的支持。

也就意味着:之前看的那篇开发命令行的文章过时了,仔细一看是 2019-3 的文章

https://www.twilio.com/blog/how-to-build-a-cli-with-node-js

所以现在需要声明依赖的 node 版本、移除 CommonJS 的写法

按说声明 node >= 13.2 即可,但看了下官方版本列表,13 已废弃,所以决定依赖 >=14

https://nodejs.org/en/about/releases/

image

sinkcup commented 3 years ago

用 ES6 重构完毕,需要发布新版本,偶然发现 npm version 官方命令,很有意思:

自动生成的 git tag 带 v,而 package.json 里面自动+1 不带 v

image

搜了下,早有讨论:https://github.com/semver/semver/issues/204

我一直是用「不带 v」的,现在看来,npm 包和官方保持一致比较好。

sinkcup commented 3 years ago

12 为了兼容 npx,决定把 bin 改成和包名一致,免得出现像 remark 和 remark-cli 那样不一致的问题,让开发者难以理解:

npm install -save-dev remark-cli remark-preset-lint-recommended
npx remark -f docs/

image

sinkcup commented 3 years ago

加上了 test,生成的是 clover 格式,决定立即做一个新功能:#5,而且带着测试一起提交。

做完加 codecov 时,发现它有个 bug:明明是 main 分支,链接却是 master 分支,导致图片打不开。

image

sinkcup commented 3 years ago

今天搞定了#7 帮助提示,解决了依赖注入,补上了测试。截图:

image

sinkcup commented 3 years ago

偶然发现 shell 命令报错好像有标准格式:

image

查到了 https://superuser.com/a/1334906/305460

fprintf (stderr, "%s: Couldn't open file %s; %s\n",
               program_invocation_short_name, name, strerror (errno));
      exit (EXIT_FAILURE);

需要调整一下现在的代码 #17