概要
自分のライブラリのカバレッジがとても低く、何故なんだろうと思っていて調べたのですが、webpack側で作ったソースが含まれていたのが原因でした。
今回はその対応するために結構苦労したのでメモしておきます。
webpackのソースが含まれている時のカバレッジ(間違い)
自分のソースのみのカバレッジ(正しい)
webpackでソースマップの出力をする
devtool: 'inline-source-map'
って所です。この設定を有効化することによってビルドファイルの中にソースマップを含めることができます。
この設定をしないとnyc側で元のソースを辿って正しいカバレッジを取得することができません。注意しましょう。
var nodeExternals = require('webpack-node-externals');
module.exports = {
mode: 'development',
externals: [nodeExternals()],
target: 'node',
devtool: 'inline-source-map',
entry: './src/main.js',
output: {
library: 'nomlish',
libraryTarget: 'umd'
},
module: {
rules: [
{
test: /\.js$/,
use: [
{
loader: 'babel-loader',
options: {
presets: [
'@babel/preset-env',
]
}
}
]
}
]
}
};
nycでビルド先ファイルを除外する
公式ドキュメント
package.jsonにnycの設定を記述し、ビルドファイルのカバレッジを計測しないようにします。ビルドファイルのパスを記述します。
私のソースの場合src/main.jsが自分で書いたソースなのでそれ以外は見る必要がありません。
"nyc": {
"exclude":["dist"]
},
↓の画像ではwebpack→bootstrap、webpack→universalModuleDefinitionがカバレッジに含まれていますがこのソースがdist配下に存在するからですね。
あとがき
ava公式のカバレッジ取得についての記述
nyc公式のカバレッジ取得についての記述
テストにはavaを使用していたのですが、どちらの公式ドキュメントにもwebpackとの併用ケースがなくこの対応だけにかなり苦労しました。
特殊なケースなのかもしれませんがやはりググっても記事は少なく、こういう時に公式ドキュメントから紐解いて問題を解決する能力が必要なんだなと実感しました。