びぼーろくっ!

誰かに見せるわけでもないけど、備忘録として。。

テストカバレッジを入れました。

テストカバレッジを入れました。

テストカバレッジのnycをmochaに入れました。
mochaでテストの網羅率を調べたいという際に便利です。
使い方やインストール方法はこちら↓

Using Istanbul With 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を実行した場合このような結果が表示されました。

f:id:kinachan0725:20170726172920p:plain
(必要のないテストはマスクかけました。)

各画面の見方です。

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の関数を削除した場合、値はどう変化するでしょうか。
試してみます。

f:id:kinachan0725:20170726173405p:plain

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);
  });
});

f:id:kinachan0725:20170726173614p:plain

んんん~~・・・
なぜStmtsが100になるのだ・・・
(今回の場合だとfalse,trueのパターンが存在しないためBranchが94%になっている)
それぞれ渡された引数がtrue,falseで存在するからかな。
まだまだ検証が必要のようです。

追記:パラメーターは関係なくそのままの命令網羅のようです。