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

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

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

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

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

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