テストカバレッジを入れました。
テストカバレッジを入れました。
テストカバレッジのnycをmochaに入れました。
mochaでテストの網羅率を調べたいという際に便利です。
使い方やインストール方法はこちら↓
//テスト対象メソッド const red = 1; const blue = 2; const green = 3; const black = 4; exports.isNull = (val) => { return val === null; } exports.colorString = (color) => { const result = {}; if (color === red) { result.color = 'red'; } if (color === blue) { result.color = 'blue'; } if (color === green) { result.color = 'green'; } if (color === black) { result.color = 'black'; } return result; };
//テストコード import mocha from 'mocha'; import assert from 'power-assert'; function requireColor(colorCode) { const color = require('../testTarget/color'); const colorStr = color.colorString(colorCode); return colorStr; } describe('color.js', () => { it('red', () => { // テストケース const colorString = requireColor(1); // test対象メソッド assert('red' === colorString.color); // 検証 }); it('blue', () => { const colorString = requireColor(2); assert('blue' === colorString.color); }); it('green', () => { const colorString = requireColor(3); assert('green' === colorString.color); }); });
こんなソースがあったとしましょう。
その場合、nycを実行した場合このような結果が表示されました。
(必要のないテストはマスクかけました。)
各画面の見方です。
Stmts : プログラムの各ステートメントは実行されましたか?(調べたら命令網羅と同義でした)
Branch : ifやcaseなどの全ての分岐の処理が実行されたか否か?
Funcs:各関数が呼び出されたかの網羅率
Line : ソースファイルの各実行可能行が実行されたか
Uncovered Line: Lineの対象を示す行番号
stackoverflowの文言を自分なりに翻訳しました。
間違っていたら教えてください・・・
testing - How do I read an Istanbul Coverage Report? - Stack Overflow
まずは分かり易いところから
Funcsが50%になっているのはisNull未実行&colorString実行の為です。
各関数が全てテスト実行されれば100%になります。
Uncovered Line・・全テストの中で処理が走っていない部分を記述されます。
下記2行が走っていない為ですね。
return val === null; //8行目 result.color = 'black'; //23行目
Branch・・各ifやcaseなどの分岐の処理が走っているか
if (color === back)
この処理が走っていない為でしょう。
Stmtsは置いといてisNullの関数を削除した場合、値はどう変化するでしょうか。
試してみます。
Funcsが100%になり、Lineも88.24⇒93.33、Stmtsも88.24⇒93.33に変化しましたね。
isNullの処理を削除したのでresult.color = 'black'; が23行目から10行目に変化しています。
ただ・・Stmtsの値の変化に関しては理解出来ませんでした。
こんな感じのテストとメソッドを書いてみたのですが・・・
//先ほどのテスト対象のコードに追記しています。 exports.ifCheck = (isHappy, isRich) => { let youState = 'You are '; if (isHappy) { youState += 'Happy'; } if (isRich) { if (isHappy) youState += '&'; youState += 'Rich'; } if (!isHappy && !isRich) { youState = 'oh my god...'; } return youState; };
//同じくテストコードに追記 describe('testCase2', () => { it('You are Happy&Rich', () => { const result = requireifCheck(true, true); assert('You are Happy&Rich' === result); }); it('You are Happy', () => { const result = requireifCheck(true, false); assert('You are Happy' === result); }); it('oh my god...', () => { const result = requireifCheck(false, false); assert('oh my god...' === result); }); });
んんん~~・・・
なぜStmtsが100になるのだ・・・
(今回の場合だとfalse,trueのパターンが存在しないためBranchが94%になっている)
それぞれ渡された引数がtrue,falseで存在するからかな。
まだまだ検証が必要のようです。
追記:パラメーターは関係なくそのままの命令網羅のようです。