Jestのcode coverageをやってみた
はじめに
Jestは、テストケースを記述するだけでなく、コードがどれだけテストされているかを可視化する強力なテストフレームワークです。Jestのcode coverage機能を使用すると、テスト中にコードがどの程度実行されたかを測定でき、重要な機能がテストされないまま残ることを防ぎます。
前提条件
コードカバレッジメトリクスを使用する前に、プロジェクトにJestをインストールしてください。以下のコマンドでインストールできます:
npm install jest
主要なカバレッジメトリクスの説明
Jestは、テストケースを評価するための詳細なカバレッジメトリクスを提供します。以下は、主な4つのメトリクスです:
- Statements(ステートメント):テスト中に実行された実行可能ステートメントの割合。
- Branches(ブランチ):テスト中に実行された条件分岐(例:
if
、else
、switch
)の割合。 - Functions(関数):テスト中に呼び出された関数やメソッドの割合。
- Lines(行):テスト中に実行された個々のコード行の割合。
テストケースを記述するコード
const add = (a, b) => {
return a + b;
};
const subtract = (a, b) => {
return a - b;
};
const multiply = (a, b) => {
return a * b;
};
const divide = (a, b) => {
if (b === 0) {
return null;
} else {
return a / b;
}
};
module.exports = { add, subtract, multiply, divide };
コードカバレッジを使用した例
1. 初期テストケースの例
const { add, subtract, multiply } = require("./index.js");
describe("計算機関数", () => {
test("add関数", () => {
const res = add(3, 8);
expect(res).toBe(11);
});
test("subtract関数", () => {
const res = subtract(10, 5);
expect(res).toBe(5);
});
test("multiply関数", () => {
const res = multiply(2, 3);
expect(res).toBe(6);
});
});
テストを実行し、カバレッジレポートを生成します:
npx jest --coverage
レポートを開く:
open coverage/lcov-report/index.html
結果:
divide関数のテストケースが記述されていないため、カバレッジレポートには不完全なメトリクスが表示されます:
- 関数カバレッジ:75%
ブランチカバレッジ:0%(コード内の未テストのif-elseブランチがあるため)。 - レポートでは、赤色で示された部分がテストされていないコード行を特定できます。
2. テストを追加する
カバレッジを向上させるために、divide関数のテストケースを追加します:
const { add, subtract, multiply, divide } = require("./index.js");
describe("計算機関数", () => {
test("add関数", () => {
const res = add(3, 8);
expect(res).toBe(11);
});
test("subtract関数", () => {
const res = subtract(10, 5);
expect(res).toBe(5);
});
test("multiply関数", () => {
const res = multiply(2, 3);
expect(res).toBe(6);
});
test("divide関数 -> nullを返す", () => {
const res = divide(22, 0);
expect(res).toBe(null);
});
});
更新結果:
これによりカバレッジは向上しますが、一部のブランチが未テストのままです。
- divide関数にif-elseのブロックが含まれている場合、nullブランチのみがテストされました。
- ブランチカバレッジは50%に改善されますが、未実行のブランチは赤色で示されたままです。
3. 100%カバレッジを達成する
すべてのブランチとコード行をカバーするテストケースを記述します:
const { add, subtract, multiply, divide } = require("./index.js");
describe("計算機関数", () => {
test("add関数", () => {
const res = add(3, 8);
expect(res).toBe(11);
});
test("subtract関数", () => {
const res = subtract(10, 5);
expect(res).toBe(5);
});
test("multiply関数", () => {
const res = multiply(2, 3);
expect(res).toBe(6);
});
test("divide関数 -> nullを返す", () => {
const res = divide(22, 0);
expect(res).toBe(null);
});
test("divide関数 -> 結果を返す", () => {
const res = divide(100, 25);
expect(res).toBe(4);
});
});
最終結果:
すべてのテストケースがすべての行とブランチをカバーしているため、カバレッジレポートには、すべてのメトリクスで100%カバレッジが表示されます。これにより、コードのすべての部分がテストされました。
結論
Jestのカバレッジレポートでは、テストされていないコードを簡単に確認できます。赤色で示された行は未テストのコードです。Statements
,Branches
,Functions
,Lines
などのメトリクスで、テストカバレッジを包括的に把握できます。
コードカバレッジは未テストのコードを特定するのに役立つものの、100%のコードカバレッジを目指すことはあまり現実的ではありません。すべてのコードをテスト中に少なくとも1回実行する必要があるため、それを達成するのはコストがかかり、困難です。そのため、理想的な割合はプロジェクトによりますが、一般的には50%から80%の範囲が良いとされています。
詳しくは以下のリンクをご参照ください。