ベストプラクティスのテスト
効果的なテストでは、次のことを行います。
- 可能な限り多くのコード行をカバーする。Apex をリリースまたは Force.com AppExchange 用にパッケージ化する前に、次の条件を満たす必要があります。
- 条件ロジックの場合 (3 項演算子など)、コードロジックの各ブランチを実行する。
- 有効な入力および無効な入力を使用してメソッドへのコールを行う。
- エラーが予期され、try…catch ブロックで捕捉されない限り、例外が発生することなく正常に完了する。
- 例外を捕捉するだけでなく、捕捉されたすべての例外を処理する。
- System.assert メソッドを使用して、コードが適切に動作することを検証する。
- runAs メソッドを使用して、さまざまなユーザコンテキストでアプリケーションをテストする。
- 一括トリガ機能を実行する。テストで最低 20 件のレコードを使用する。
- ORDER BY キーワードを使用し、レコードが予期された順序で返されるようにする。
- レコード ID が順序立っていることを想定しない。
複数のレコードを同じ要求で挿入しない限り、レコード ID は昇順で作成されません。たとえば、取引先 A を作成し、ID 001D000000IEEmT を受信した後で取引先 B を作成した場合、取引先 B の ID が次に大きい順序になる場合とならない場合があります。
- テストデータを次のように設定する。
- テストクラスで必要なデータを作成して、テストが特定の組織のデータに依存する必要がないようにする。
- Test.startTest メソッドをコールする前にすべてのテストデータを作成する。
- テストでは何も確定しないため、データを削除する必要がない。
- コメントの記述では、テストの内容だけでなく、テスト実施者によるデータに関する想定事項やテスト結果予測などを明記する。
- アプリケーションで個別にクラスをテストする。1 回のテストでアプリケーション全体をテストしない。
多数のテストを実行する場合は、次の点を考慮します。
- Force.com IDE では、Apex プロジェクトの [参照タイムアウト] 値を大きくする必要がある。���細は、https://developer.salesforce.com/page/Apex_Toolkit_for_Eclipseを参照してください。
- Salesforce ユーザインターフェースで、[すべてのテストを実行] ボタンを使用してすべてのテストを同時に実行するのではなく、組織内のクラスを個別にテストする必要がある場合がある。
テストの並列実行のベストプラクティス
Salesforce ユーザインターフェース (開発者コンソールなど) から開始する複数のテストを並列して実施します。テストを並列実行すると、テストの実行時間が短縮されます。テストの並列実行によってデータの競合の問題が生じることがありますが、そうした場合には並列実行をオフにできます。データの競合の問題や UNABLE_TO_LOCK_ROW エラーが生じる可能性があるのは、特に次のような場合です。
- 複数のテストで同じレコードを同時に更新する場合。同じレコードが更新されるのは、通常、テストが独自のデータを作成せず、データの分離をオフにして組織のデータにアクセスする場合です。
- 並列して実行しているテストで、インデックス項目値が重複しているレコードを作成しようしてデッドロックが発生する場合。デッドロックが生じるのは、実行中の 2 つのテストが相互にデータのロールバックを待機している場合です。2 つのテストが、一意のインデックス項目値が同じレコードを異なる順序で挿入したときにこの状態が発生します。
こうしたエラーが発生しないようにするには、Salesforce ユーザインターフェースでテストの並列実行をオフにします。
- [設定] から、[クイック検索] ボックスに「オプション...」と入力し、[Options...] を選択します。
- [Apex テスト実行オプション] ダイアログで、[並列 Apex テストを無効化] を選択して、[OK] をクリックします。