問題
開発者は、Apexテストメソッドがサンドボックスで失敗することに気づきました。問題を特定するために、開発者はテストメソッド内のコードをコピーし、開発者コンソールの匿名実行ツールを使用してコードを実行したところ、コードは例外やエラーなしで実行されます。テストメソッドがサンドボックスで失敗し、開発者コンソールで合格したのはなぜですか。
- テストメソッドは @future メソッドを呼び出しているため
- テストメソッドのコードに構文エラーがあるため
- テストメソッドは、特定のユーザーとして実行するためにSystem.runAsを使用しないため
- テストメソッドはサンドボックス内の既存のデータに依存しているため
正解
- テストメソッドは @future メソッドを呼び出しているため
- テストメソッドのコードに構文エラーがあるため
- テストメソッドは、特定のユーザーとして実行するためにSystem.runAsを使用しないため
- テストメソッドはサンドボックス内の既存のデータに依存しているため
解説
それぞれの選択肢の理由について説明します。
□ テストメソッドは @future メソッドを呼び出しているため
これは不正解です。@future メソッドは非同期で実行されるため、テストメソッドの実行とは独立して動作します。しかし、今回の問題の直接的な原因とは考えられません。
□ テストメソッドのコードに構文エラーがあるため
これは不正解です。構文エラーが存在する場合、開発者コンソールの匿名実行ツールでもエラーが発生するはずです。
□ テストメソッドは、特定のユーザーとして実行するためにSystem.runAsを使用しないため
これは不正解です。System.runAs
を使用しなかった場合、特定のユーザーコンテキストでの実行が問題になることがありますが、開発者コンソールでの匿名実行は実行ユーザーの権限で行われるため、この点が原因でテストがサンドボックスで失敗するとは限りません。
□ テストメソッドはサンドボックス内の既存のデータに依存しているため
これは正解です。Apexテストメソッドはデフォルトで隔離されたテスト環境で実行され、既存のデータにアクセスすることはありません(@isTest(SeeAllData=true)が設定されていない限り)。もしテストメソッドが既存のデータに依存している場合、サンドボックス内でそのデータが欠如しているか異なっている可能性があり、そのために失敗することがあります。しかし、開発者コンソールで匿名実行を行う場合は、実際の環境データを用いて実行されるため、問題が発生しなかった可能性があります。
コメント