この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

テストとコードカバー率

Apex テストフレームワークは、1 つ以上のテストを実行するたびに Apex クラスおよびトリガーのコードカバー率の数値を生成します。コードカバー率は、クラスおよびトリガー内の実行可能なコード行がテストメソッドで何行実行されたかを示します。トリガーおよびクラスをテストするテストメソッドを記述してから、それらのテストを実行してコードカバー率情報を生成します。
テストメソッドでカバーされる Apex トリガーおよびクラス
テストメソッドでカバーされる Apex トリガーおよびクラス

コードの品質確保に加えて、単体テストで Apex のリリースまたはパッケージ化のコードカバー率要件を満たすことができます。Salesforce AppExchange 用に Apex をリリースまたはパッケージ化するには、単体テストが Apex コードの 75% 以上をカバーし、テストに合格する必要があります。

コードカバー率はテストの有効性の指標の 1 つとなりますが、テストの有効性を保証するわけではありません。テストの品質も重要ですが、コードカバー率をツールとして使用し、追加テストが必要かどうかを評価できます。Apex コードをリリースまたはパッケージ化するには、最小コードカバー率要件を満たす必要がありますが、テストの目標はコードカバー率だけではありません。テストでは、アプリケーションの動作を確認し、コードの品質を確保する必要があります。

コードカバー率の計算方法

コードカバー率のパーセンテージ値は、カバーされている行数を、カバーされている行数とカバーされていない行数の合計で除算する計算で求められます。実行可能なコード行のみが含まれます。(コメントおよび空白行は計数されません)。System.debug() ステートメントと中括弧は、1 行に単独で使用されている場合は除外されます。1 行に複数のステートメントがある場合、コードカバー率については 1 行として計数されます。複数の式で構成されるステートメントが複数行に記述されている場合、コードカバー率について各行が計数されます。

1 つのメソッドを含むクラスの例を次に示します。このクラスのテストが実行され、開発者コンソールでこのクラスのコードカバー率を表示するオプションが選択されました。青い行は、テストでカバーされる行を表します。強調表示されていない行は、コードカバー率の計算から除外されます。赤い行は、テストでカバーされなかった行を表します。完全なカバー率を達成するには、追加テストが必要です。テストで異なる入力を使用して getTaskPriority() をコールし、その戻り値を確認する必要があります。

これは、テストメソッドで部分的にカバーされるクラスです。対応するテストクラスは表示されていません。

開発者コンソールのコードカバー率ビューでのサンプルクラス

テストクラス (@isTest のアノテーションが付加されたクラス) は、コードカバー率の計算から除外されます。この除外は、テストメソッドが含まれるか、テストに使用されるユーティリティメソッドが含まれるかに関わらず、すべてのテストクラスに適用されます。

Apex コンパイラーによって、ステートメントの式が最適化される場合があります。たとえば、複数の文字列定数が + 演算子で連結される場合、コンパイラーは内部的にそれらの式を 1 つの文字列定数に置き換えます。文字列の連結式が複数行にわたる場合、最適化後、追加の行はコードカバー率計算の一部として計算されません。この点を説明するため、文字列変数が、連結される 2 つの文字列定数に割り当てられています。2 つ目の文字列定数は、別の行にあります。

メモ

コードカバー率の調査

テストの実行後、開発者コンソールの [Tests (テスト)] タブでコードカバー率情報を表示できます。コードカバー率ペインには、各 Apex クラスのカバー率情報と、組織のすべての Apex コードの全体的カバー率が表示されます。

また、コードカバー率は 2 つの Lightning プラットフォーム Tooling API オブジェクト、ApexCodeCoverageAggregate と ApexCodeCoverage に保存されます。ApexCodeCoverageAggregate には、テストするすべてのテストメソッドの確認後にクラスでカバーされている行の合計が保存されます。ApexCodeCoverage には、個々のテストメソッドでカバーされている行とカバーされていない行が保存されます。このため、ApexCodeCoverage では 1 つのクラスに複数 (テストしたテストメソッドごとに 1 つずつ) のカバー率結果が含まれることがあります。SOQL と Tooling API を使用してこれらのオブジェクトを照会し、カバー率情報を取得することができます。SOQL クエリと Tooling API の併用��、コードカバー率を確認するもう 1 つの方法であり、より詳しい情報をすばやく取得できます。

たとえば、次の SOQL クエリは、TaskUtil クラスのコードカバー率を取得します。カバー率は、このクラス内のメソッドを実行したすべてのテストクラスから集計されます。

次の SOQL クエリには Tooling API が必要です。このクエリを実行するには、開発者コンソールでクエリエディターを使用し、[Use Tooling API (Tooling API を使用)] をチェックします。

メモ

テストで部分的にカバーされるクラスのサンプルクエリ結果を次に示します。

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 行のみが残ります。