更新履歴
- 2023/07/23 nyc 関係を更新
目的
- github の ReadMe に coverage badge を表示したい
前提
-
Node.js
の環境構築済み -
Git
とGithub
の環境構築済み
環境
- Windows - v11
- Node.js - v16
- nyc - v15
- mocha - v10
- chai - v4
- Coveralls - v3
- Github Actions
結論
こうする。
}
"scripts": {
"pretest": "rm -rf .nyc_output",
"test": "nyc mocha -R spec",
"precoverage": "rm -rf coverage && mkdir coverage",
"coverage": "npm run test && nyc report --reporter=lcovonly"
},
"devDependencies": {
"chai": "^4.3.7",
"coveralls": "^3.1.1",
"mocha": "^10.1.0",
"nyc": "^15.1.0"
}
}
{
"reporter": [
"text-summary"
],
"extension": [
".js",
".cjs",
".mjs",
".ts"
],
"exclude": [
"**/test/**.spec.js"
]
}
name: Coveralls GitHub Action
on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:
jobs:
test:
runs-on: windows-latest
strategy:
matrix:
node-version: [15.x, 16.x] # (need)
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }} # (need)
cache: "npm"
cache-dependency-path: "**/package-lock.json"
- run: npm ci # (need) # better than "npm install"
- run: npm run coverage # (need)
- name: Coveralls GitHub Action
uses: coverallsapp/github-action@1.1.3 # (need)
with:
github-token: ${{ secrets.GITHUB_TOKEN }} # (need)
[![Coverage Status](https://coveralls.io/repos/github/[user]/coverage-badge-test/badge.svg?branch=main)](https://coveralls.io/github/[user]/coverage-badge-test?branch=main)
・・・ 以下 REAMDE 本文 ・・・
詳細
- Test runner : mocha (NPM)
- assertion library : Chai (NPM)
- coverage tool : nyc (NPM)
- coverage badge : coveralls (NPM)
1. nyc + mocha + chai のセットアップ
1.1. install
$ npm install mocha --save-dev
$ npm install chai --save-dev
$ npm install nyc --save-dev
1.2. テスト対象の実行ファイルを作成
内容は適当。
module.exports = () => {
console.log("Hallow World");
};
1.3. テストスクリプトの作成
デフォルトのファイル構成
-
test
- index.spec.js
内容は適当に。
const { describe, it } = require("mocha");
const { assert } = require("chai");
describe("test index", () => {
const index = require("../index");
it("index is function", () => {
assert.isFunction(index);
});
});
1.4. npm run script を作成
以下の様にnyc
を噛ませてcoverage
が出力される様にする。
{
"scripts":{
"test": "nyc mocha -R spec"
}
}
1.4. テストの実行確認
スクリプトを実行
$ npm run test
以下の様にcoverage
が表示されれば、一旦OK
> nyc mocha -R spec
test index
✔ index is function
1 passing (6ms)
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 50 | 100 | 0 | 50 |
index.js | 50 | 100 | 0 | 50 | 2
----------|---------|----------|---------|---------|-------------------
情報
nyc
でcoverage
を出力すると、以下の様に.nyc_output
ディレクトリが自動生成されますが、coverage
の生データであり、気にする必要はありません。(temp-dir:"./.nyc_output"
(参考:github))
- .nyc_output
2. Coveralls
をセットアップ
2.1. coveralls.io
にアカウントを作成する
リンク:Coveralls.io
- 公開リポジトリ+OSSであれば、無料。
2.2. coveralls.io
とGithub
を連携する
Coveralls.io
からGithub
にHTTPリクエストが発生するので、その認証が必要。らしい。
連携が出来ていれば、coveralls.io
のアカウントページにGithub
のプロフィールアイコンが表示される。ハズ。
2.3. Coveralls.io
とGithub
の各リポジトリを紐づけする
このページに行くと、Github
の個人リポジトリの一覧が表示されるので、
coverage-badge
を出力したいリポジトリ(今いじっているリポジトリ)を OFF → ON に切り替える。まだリモートリポジトリを作って無いのならこのタイミングGithub
に作成しちゃいましょう。
2.4. install
$ npm install --save-dev coveralls
2.5. npm run script を作成する
coveralls
が読み込み可能なcoverage-report
が出力される様にする必要がある。
{
"scripts":{
"test": "nyc mocha -R spec",
+ "precoverage": "rm -rf coverage && mkdir coverage",
+ "coverage": "npm run test && nyc report --reporter=lcovonly"
}
}
解説
-
coverage-report
はcoveralls
の仕様上./coverage/lcov.info
ファイルにtext-lcov
形式で出力される必要がある。ファイルパスが一致しない場合はError: Lcov file not found.
を出力して終了する。 -
nyc
のreporter
はファイル形式、出力ディレクトリの指定はできるが、ファイル名の指定が出来ない。また、出力場所を指定したとしてもそのディレクトリが無い場合、エラーを出力して終了する。 - 上記の理由から、まず出力場所である
./coverage
ディレクトリを作成する必要がある。rm -rf coverage && mkdir coverage
-
MakeFile
でやれ的な説明が多いが、コマンドラインから直接作っても動作した
-
-
node-coveralls
のgithubにはnyc npm test && nyc report --reporter=text-lcov | coveralls
と書かれているが、それだと"Error : Failed to parse string
が出力され終了してしまう。
[error] "2022-11-22T09:33:14.585Z" 'error from lcovParse: ' 'Failed to parse string'
[error] "2022-11-22T09:33:14.588Z" 'input: ' ''
[error] "2022-11-22T09:33:14.588Z" 'error from convertLcovToCoveralls'
C:\Users\[user]\workSpace\coverage-badge-test\node_modules\coveralls\bin\coveralls.js:19
throw err;
^
Failed to parse string
(Use `node --trace-uncaught ...` to show where the exception was thrown)
- なので、
npm script
ではreporter
の出力までを行い、あとはgithub-actions
に任せるのが良い。
2.6. reporter
の実行確認
以下を実行
$ npm run coverage-reporter
以下の様になればOK。
> rm -rf coverage && mkdir coverage
> npm run test && nyc report --reporter=lcovonly
> rm -rf .nyc_output
> nyc mocha -R spec
test index
✔ index is function
1 passing (6ms)
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 50 | 100 | 0 | 50 |
index.js | 50 | 100 | 0 | 50 | 2
----------|---------|----------|---------|---------|-------------------
確認
./coverage/lcov.info
ファイルが作成されているか確認する。
-
coverage
- lcov.info
TN:
SF:index.js
FN:1,(anonymous_0)
FNF:1
FNH:0
FNDA:0,(anonymous_0)
DA:1,1
DA:2,0
LF:2
LH:1
BRF:0
BRH:0
end_of_record
3. Github Actions
を作成する
本ページ内の結論に書いた.github/workflow/coverage-badge.yml
。
3.1. Github Action
を実行
Githubのリモートリポジトリに今いじっているローカルリポジトリをpushして確認。
4. README にバッジを埋め込む
本ページ内の結論に書いたREADME.md
。
README
に貼り付けるMarkdownは、coveralls.io
のREPOS
のページ内にあるBUILD #***
のリンクを踏んだ先にある各ビルド毎のcoverage
詳細ページにある「EMBED▼」ボタンからジェネレートできる。
了
参考リンク