Jestのcode coverageをやってみた

Jestのcode coverageをやってみた

Clock Icon2025.01.29

はじめに

Jestは、テストケースを記述するだけでなく、コードがどれだけテストされているかを可視化する強力なテストフレームワークです。Jestのcode coverage機能を使用すると、テスト中にコードがどの程度実行されたかを測定でき、重要な機能がテストされないまま残ることを防ぎます。

前提条件

コードカバレッジメトリクスを使用する前に、プロジェクトにJestをインストールしてください。以下のコマンドでインストールできます:

npm install jest

主要なカバレッジメトリクスの説明

Jestは、テストケースを評価するための詳細なカバレッジメトリクスを提供します。以下は、主な4つのメトリクスです:

  • Statements(ステートメント):テスト中に実行された実行可能ステートメントの割合。
  • Branches(ブランチ):テスト中に実行された条件分岐(例:ifelseswitch)の割合。
  • Functions(関数):テスト中に呼び出された関数やメソッドの割合。
  • Lines(行):テスト中に実行された個々のコード行の割合。

テストケースを記述するコード

index.js
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. 初期テストケースの例

index.test.js
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ブランチがあるため)。
  • レポートでは、赤色で示された部分がテストされていないコード行を特定できます。

Screenshot 2025-01-29 at 15.20.17

Screenshot 2025-01-29 at 15.20.07

2. テストを追加する

カバレッジを向上させるために、divide関数のテストケースを追加します:

index.test.js
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%に改善されますが、未実行のブランチは赤色で示されたままです。

Screenshot 2025-01-29 at 15.19.29

Screenshot 2025-01-29 at 15.19.39

3. 100%カバレッジを達成する

すべてのブランチとコード行をカバーするテストケースを記述します:

index.test.js
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%カバレッジが表示されます。これにより、コードのすべての部分がテストされました。

Screenshot 2025-01-29 at 15.19.11

結論

Jestのカバレッジレポートでは、テストされていないコードを簡単に確認できます。赤色で示された行は未テストのコードです。Statements,Branches,Functions,Linesなどのメトリクスで、テストカバレッジを包括的に把握できます。

コードカバレッジは未テストのコードを特定するのに役立つものの、100%のコードカバレッジを目指すことはあまり現実的ではありません。すべてのコードをテスト中に少なくとも1回実行する必要があるため、それを達成するのはコストがかかり、困難です。そのため、理想的な割合はプロジェクトによりますが、一般的には50%から80%の範囲が良いとされています。

詳しくは以下のリンクをご参照ください。
https://qiita.com/odekekepeanuts/items/d02eb38e790b93f44728

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.