単体テストの組織データとテストデータの分離
デフォルトでは、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 レコードを最初にコミットする必要があるため、テストメソッドでは作成できません。