Panda Noir

JavaScript の限界を究めるブログでした。最近は幅広めに書いてます。

Jestいいぞ

今更コードのカバレッジを気にし始めたクロパンダです(プログラミング歴7年目())。今までは結構ざっくりとテストを書いてきていました。というのも、コードカバレッジという概念がどうも七面倒でやる気が起きなかったのです。

しかし、JavaScriptテストツール「Jest」を試してみたところ、かなり使いやすかったので紹介したいと思います(今更)

そもそもコードカバレッジとは?

コードのうち「テストをしたときに実行された箇所」のことです。

例えば以下の2関数をテストするケースを考えます。

const assert = require('assert');
const f = x => {
    return x * x;
};
const g = x => {
    return x + x;
};
assert.equal(f(2), 4);

この場合、g()の中は実行されていないので、f()の部分の割合がカバレッジとなります。

他にも「ifによるの分岐がどれほどカバーされているか」などもカバレッジの対象となります。

const h = x => {
    if (x <= 3) return 0;
    return x;
}
assert.equal(h(4), 4);

この場合は「xが3以下のケース」が実行されていないのでカバレッジは100%となりません。

Jestでカバレッジを計測する

ではJestでカバレッジを計測してみます。

まずJestをインストールします。

$ yarn add -D jest
$ npm i -D jest

次にテストを書いていきます。コードは__tests__/ディレクトリ以下に書いてください。

main.js

module.exports = {
    f(x) {return x * x},
    g(x) {return x + x},
    h(x) {
        if (x <= 3) return 0;
        return x;
    }
};

__tests__/main.js

const assert = require('assert');
const {f, g, h} = require('../main.js');

describe('MyFunctions', () => {
    describe('f()', () => {
        it('should square x.', () => {
            assert.equal(f(3), 9);
        });
    });
    describe('g()', () => {
        it('should twice x.', () => {
            assert.equal(g(3), 6);
        });
    });
    describe('h()', () => {
        it('should return 0 when x is 3 or less.', () => {
            assert.equal(h(1), 0);
        });
        it('should return x when x is greater than 3.', () => {
            assert.equal(h(4), 4);
        });
    });
});

あとは次を実行するとカバレッジが表示されます。

$ npx jest --coverage

また、coverage/lcov-report/index.htmlにテストで実行された箇所が可視化されます。どこのテストを書けばいいのかひと目で分かって便利です。

f:id:panda_noir:20180116153813p:plain

npm run coverageで実行する

package.jsonに次のように記述しておくとカバレッジ計測が楽になります。

  "scripts": {
    "coverage": "jest --coverage"
  },