テストとコードカバー率

コードの品質確保に加えて、単体テストで Apex のリリースまたはパッケージ化のコードカバー率要件を満たすことができます。Salesforce AppExchange 用に Apex をリリースまたはパッケージ化するには、単体テストが Apex コードの 75% 以上をカバーし、テストに合格する必要があります。
コードカバー率はテストの有効性の指標の 1 つとなりますが、テストの有効性を保証するわけではありません。テストの品質も重要ですが、コードカバー率をツールとして使用し、追加テストが必要かどうかを評価できます。Apex コードをリリースまたはパッケージ化するには、最小コードカバー率要件を満たす必要がありますが、テストの目標はコードカバー率だけではありません。テストでは、アプリケーションの動作を確認し、コードの品質を確保する必要があります。
コードカバー率の計算方法
コードカバー率のパーセンテージ値は、カバーされている行数を、カバーされている行数とカバーされていない行数の合計で除算する計算で求められます。実行可能なコード行のみが含まれます。(コメントおよび空白行は計数されません)。System.debug() ステートメントと中括弧は、1 行に単独で使用されている場合は除外されます。1 行に複数のステートメントがある場合、コードカバー率については 1 行として計数されます。複数の式で構成されるステートメントが複数行に記述されている場合、コードカバー率について各行が計数されます。
1 つのメソッドを含むクラスの例を次に示します。このクラスのテストが実行され、開発者コンソールでこのクラスのコードカバー率を表示するオプションが選択されました。青い行は、テストでカバーされる行を表します。強調表示されていない行は、コードカバー率の計算から除外されます。赤い行は、テストでカバーされなかった行を表します。完全なカバー率を達成するには、追加テストが必要です。テストで異なる入力を使用して getTaskPriority() をコールし、その戻り値を確認する必要があります。
これは、テストメソッドで部分的にカバーされるクラスです。対応するテストクラスは表示されていません。

テストクラス (@isTest のアノテーションが付加されたクラス) は、コードカバー率の計算から除外されます。この除外は、テストメソッドが含まれるか、テストに使用されるユーティリティメソッドが含まれるかに関わらず、すべてのテストクラスに適用されます。
コードカバー率の調査
テストの実行後、開発者コンソールの [Tests (テスト)] タブでコードカバー率情報を表示できます。コードカバー率ペインには、各 Apex クラスのカバー率情報と、組織のすべての Apex コードの全体的カバー率が表示されます。
また、コードカバー率は 2 つの Lightning プラットフォーム Tooling API オブジェクト、ApexCodeCoverageAggregate と ApexCodeCoverage に保存されます。ApexCodeCoverageAggregate には、テストするすべてのテストメソッドの確認後にクラスでカバーされている行の合計が保存されます。ApexCodeCoverage には、個々のテストメソッドでカバーされている行とカバーされていない行が保存されます。このため、ApexCodeCoverage では 1 つのクラスに複数 (テストしたテストメソッドごとに 1 つずつ) のカバー率結果が含まれることがあります。SOQL と Tooling API を使用してこれらのオブジェクトを照会し、カバー率情報を取得することができます。SOQL クエリと Tooling API の併用��、コードカバー率を確認するもう 1 つの方法であり、より詳しい情報をすばやく取得できます。
たとえば、次の SOQL クエリは、TaskUtil クラスのコードカバー率を取得します。カバー率は、このクラス内のメソッドを実行したすべてのテストクラスから集計されます。
テストで部分的にカバーされるクラスのサンプルクエリ結果を次に示します。
| ApexClassOrTrigger.Name | NumLinesCovered | NumLinesUncovered |
|---|---|---|
| TaskUtil | 8 | 2 |
次の例は、どのテストメソッドがクラスをカバーしているかを判断できる方法を示します。このクエリは異なるオブジェクト ApexCodeCoverage からカバー率情報を取得します。このオブジェクトにはテストクラスおよびメソッドによるカバー率情報が保存されます。
サンプルクエリ結果を次に示します。
| ApexTestClass.Name | TestMethodName | NumLinesCovered | NumLinesUncovered |
|---|---|---|---|
| TaskUtilTest | testTaskPriority | 7 | 3 |
| TaskUtilTest | testTaskHighPriority | 6 | 4 |
ApexCodeCoverage の NumLinesUncovered 値はそれぞれ 1 つのテストメソッドに関するカバー率を表すため、ApexCodeCoverageAggregate の集計結果で対応する値とは異なります。たとえば、テストメソッド testTaskPriority() はカバー可能な合計 10 行のうちクラス全体で 7 行をカバーしているため、testTaskPriority() でカバーされていない行数は 3 行 (10 ~ 7) です。ApexCodeCoverageAggregate に保存される集計カバー率にはすべてのテストメソッドによるカバー率が含まれるため、testTaskPriority() と testTaskHighPriority() のカバー率が含まれ、どのテストメソッドでもカバーされていない 2 行のみが残ります。