Mochaでコードカバレッジを測定する方法
Mochaでコードカバレッジ
コードカバレッジとは、テストによって実行されたコード行の割合を測定する指標です。コードカバレッジ率が高ければ高いほど、テストによって多くのコードが実行されたことになり、潜在的なバグやエラーを見つける可能性が高くなります。
MochaとIstanbul
Mochaは、JavaScriptで書かれたテストコードを実行するためのフレームワークです。テストコードは、describe
、it
などのブロックを使って記述します。Istanbulは、テスト実行時にコードカバレッジを測定するツールです。Istanbulは、コードにインストルメンテーションと呼ばれる処理を施し、実行された行数を記録します。
Mochaでコードカバレッジを測定するには、以下の手順が必要です。
- Istanbulをインストールする
npm install istanbul
- テストコードファイルにIstanbulのインストルメンテーションを適用する
mocha --require istanbul/lib/instrument --recursive test
- テストを実行する
mocha test
- コードカバレッジレポートを生成する
istanbul report
Istanbulは、コードカバレッジレポートをHTML形式で生成します。レポートには、テスト対象コード全体のコードカバレッジ率、ファイルごとのコードカバレッジ率、実行されなかった行などが表示されます。
コードカバレッジ率を向上させるには、以下の方法があります。
- テストケースを増やす
- テスト対象コードを分割して、個別にテストする
- 条件分岐やループなどを網羅するテストコードを書く
MochaとIstanbulを組み合わせることで、Node.js開発においてコードカバレッジを簡単に測定することができます。コードカバレッジを測定することで、テストの網羅性を向上させ、コードの品質と信頼性を高めることができます。
補足
- MochaとIstanbul以外にも、Jest、Karmaなどのテストフレームワークと、NYC、Coverallsなどのコードカバレッジツールがあります。
- コードカバレッジ率は、テストの網羅性を測る指標の一つですが、100%であることが必ずしも良いわけではありません。
- コードカバレッジ率を向上させることよりも、重要なテストケースを書くことに重点を置くべきです。
// ファイル: add.js
function add(a, b) {
return a + b;
}
module.exports = add;
// ファイル: add.test.js
const assert = require('assert');
const add = require('./add');
describe('add()', function() {
it('should return the sum of two numbers', function() {
assert.equal(add(1, 2), 3);
assert.equal(add(1.5, 2.5), 4);
});
});
コードカバレッジを測定するには、以下のコマンドを実行します。
mocha --require istanbul/lib/instrument --recursive test
実行すると、以下の出力が表示されます。
Started
add
✓ should return the sum of two numbers (5ms)
Finished in 0.002s
1 test, 2 assertions, 0 failures, 0 errors
Coverage: 100% of statements (1/1), 100% of branches (1/1), 100% of functions (1/1), 100% of lines (1/1)
この出力から、add()
関数のテストコードによって、すべてのコード行が実行されたことがわかります。
コードカバレッジレポート
Istanbulは、コードカバレッジレポートをHTML形式で生成します。レポートには、以下の情報が表示されます。
- コードカバレッジ率
- ファイルごとのコードカバレッジ率
- 実行されなかった行
- 条件分岐の網羅率
istanbul report
レポートは、coverage
ディレクトリに生成されます。
Jestは、Facebookによって開発されたテストフレームワークです。Jestは、テストコードの実行とコードカバレッジの測定を単一のツールで提供します。
// ファイル: add.js
function add(a, b) {
return a + b;
}
module.exports = add;
// ファイル: add.test.js
import add from './add';
it('should return the sum of two numbers', () => {
expect(add(1, 2)).toBe(3);
expect(add(1.5, 2.5)).toBe(4);
});
jest --coverage
PASS ./add.test.js
✓ should return the sum of two numbers (6ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 1.10s
Ran all test suites.
Coverage: 100% of statements (1/1), 100% of branches (1/1), 100% of functions (1/1), 100% of lines (1/1)
Jestは、Mochaよりも使い方が簡単で、コードカバレッジレポートも自動的に生成されます。
Karmaは、JavaScriptテストランナーです。Karmaは、ブラウザ上でテストを実行し、コードカバレッジを測定することができます。
// ファイル: add.js
function add(a, b) {
return a + b;
}
module.exports = add;
// ファイル: add.test.js
const add = require('./add');
describe('add()', function() {
it('should return the sum of two numbers', function() {
assert.equal(add(1, 2), 3);
assert.equal(add(1.5, 2.5), 4);
});
});
karma start --single-run --coverage
node.js unit-testing code-coverage