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

単体テストの組織データとテストデータの分離

Salesforce API バージョン 24.0 以降で保存された Apex コードより、テストメソッドはデフォルトで、標準オブジェクト、カスタムオブジェクト、およびカスタム設定データなどの組織の既存のデータにアクセスできません。アクセスできるのは、テストメソッドが作成したデータのみです。ただし、組織またはメタデータオブジェクトの管理に使用する次のオブジェクトは、そのままテストでアクセスできます。
  • User
  • Profile
  • Organization
  • AsyncApexJob
  • CronTrigger
  • RecordType
  • ApexClass
  • ApexTrigger
  • ApexComponent
  • ApexPage

可能な場合は常に、テストごとにテストデータを作成する必要があります。この制限は、IsTest(SeeAllData=true) アノテーションで、テストクラスまたはテストメソッドにアノテーションを付加することによって無効にできます。

Salesforce API バージョン 23.0 以前を使用して保存されたテストコードは、引き続き、組織のすべてのデータにアクセスすることができ、そのデータアクセス権は変わりません。

データアクセスに関する考慮事項
  • Salesforce API バージョン 24.0 以降を使用して保存された新しいテストメソッドが、バージョン 23.0 以前を使用して保存された別のクラスのメソッドをコールする場合、コール元のデータアクセス制限がコールされるメソッドに適用されます。つまり、コールされるメソッドは、以前のバージョンで保存されていても、コール元にアクセス権がないため組織データにアクセスできません。
  • Salesforce API バージョン 23.0 以前を使用して保存された Apex コードに追加されたとき、IsTest(SeeAllData=true) アノテーションは無効です。
  • テストデータへのこのアクセス制限は、テストコンテ��ストで実行されるすべてのコードに適用されます。たとえば、テストメソッドによりトリガが実行されても、テストが組織データにアクセスできない場合は、トリガも実行できません。
  • テストで Visualforce 要求を行う場合、実行中のテストはテストのコンテキストに留まりますが、別のスレッドで実行するため、テストデータの分離が行われません。この場合、Visualforce 要求を開始した後で、組織内のすべてのデータにアクセスできるようになります。ただし、Visualforce 要求が JavaScript Remoting コールなどのコールバックを実行する場合、コールバックで挿入されたデータはテストからは認識できません。
  • Salesforce API バージョン 27.0 以前を使用して保存された Apex の場合、VLOOKUP 入力規則は、Apex テストを実行することでこの入力規則が実行されると、常に、テストデータだけでなく組織のデータを参照するように機能します。バージョン 28.0 以降、VLOOKUP 入力規則は、テストクラスまたはメソッドに IsTest(SeeAllData=true) のアノテーションが付加されていない限り、実行されている Apex テストから組織データにアクセスすることはできなくなり、テストが作成したデータのみを参照するようになりました。
  • 特定の制限により、テストメソッドから特定のデータ型を作成できない場合があります。この制限の例として、次のようなものがあります。
    • 標準オブジェクトの中には、作成できないものがあります。これらのオブジェクトについての詳細は、「Salesforce および Force.com のオブジェクトリファレンス」を参照してください。
    • 一意制約のある項目を含む一部の sObject では、重複する sObject レコードを挿入するとエラーになります。たとえば、同じ名前の複数の CollaborationGroup sObject を挿入すると、CollaborationGroup レコードには一意の名前が必要なためエラーになります。これは、テストで IsTest(SeeAllData=true) のアノテーションが付加されているかどうかに関わらず発生します。
    • Chatter の追跡変更のように、関連レコードがデータベースにコミットされた後にのみ作成されるレコードがあります。Chatter フィードのレコードの追跡変更 (FeedTrackedChange レコード) は、テストメソッドが関連レコードを変更すると、使用できません。FeedTrackedChange レコードでは、作成される前に、関連付けられている親レコードへの変更がデータベースにコミットされている必要があります。テストメソッドではデータをコミットしないため、FeedTrackedChange レコードの作成はできません。同様に、項目履歴管理レコード (AccountHistory など) は、他の sObject レコード (Account など) を最初にコミットする必要があるため、テストメソッドでは作成できません。