【Salesforce】@IsTest(SeeAllData=false)とは?意味・使いどころ・注意点を1ページで

※この記事にはアフィリエイトリンクを含みます。

Apexテストで地味に詰まりやすいのが、@IsTest(SeeAllData=false) の理解です。

ここが曖昧だと「環境によって通ったり落ちたりする」テストになりやすいです。

@IsTest(SeeAllData=false) は、テスト実行時に“組織の既存データ(本番データ)を参照できない”状態にする指定です。

テストが本番データに依存しなくなり、環境差で落ちない安定したテストになります。

この記事では、次の3点だけを短くまとめます。

  • SeeAllData=false で何が起きるか
  • @IsTest だけ書いた場合にどうなるか
  • SeeAllData=true を使う(使わざるを得ない)場面と注意点

結論:基本は SeeAllData=falseで書く

SeeAllData=false は、テストの中から 組織に既に存在するレコード(本番データ)を見えなくする設定です。

その代わり、テスト内で作ったデータ(insertしたレコード)だけを使って検証します。

こうしておくと、

  • 本番データが変わってもテストが落ちにくい
  • Sandbox/本番など環境差でも結果がブレにくい

というメリットがあります。

※ なので次は「データの作り方」を型にしておくと、テストが一気に安定します。

次に読む
SeeAllData=false を理解した次に詰まるのが「じゃあ、テストデータどう作る?」です。 コピペ地獄を終わらせるための『Test Data Factory(最小テンプレ)』をまとめました。
Apexテストデータの作り方(Test Data Factory)を読む →

SeeAllData=falseだと何が見えない?

ざっくり言うと、既存のレコード(データ)が見えません。

例:既に組織にある Account や商談などを、テストから検索しても基本的に取れません。

Integer cnt = [SELECT COUNT() FROM Account];
System.assertEquals(0, cnt);

なので、テストに必要なレコードは テストの中で自分で作るのが基本になります。

@IsTest だけ書いた場合、SeeAllDataはどうなる?

結論としては、基本は SeeAllData=false 相当(=本番データに依存しない)で考えてOKです。

ただし、チームで見たときに意図が明確になるので、実務では クラス側に明示しておくのが無難です。

@IsTest(SeeAllData=false)
public class SampleTest {
@IsTest
static void testSomething() {
// ...
}
}

最小サンプル:テストデータを作って検証する

SeeAllData=false の前提では、テスト用データを自分で作るのが基本です。

最小構成はこんな形になります。

@IsTest(SeeAllData=false)
public class AccountTest {

@IsTest
static void testAccountCreation() {
// テスト用データを作る
Account acc = new Account(Name = 'Test Account');
insert acc;

// 期待通りに作成できたか確認
Integer cnt = [SELECT COUNT() FROM Account WHERE Name = 'Test Account'];
System.assertEquals(1, cnt);
}
}

ポイントはこれだけです。

  • 「本番にあるはずのデータ」を探さない
  • 必要なものはテスト内で作る
  • 期待値(assert)で検証する

SeeAllData=trueの場合はどうなる?

SeeAllData=true にすると、テスト内から 組織の既存データ(本番データ)を参照できるようになります。

ただし、その瞬間にテストが データ依存になりやすく、環境によって結果が変わります。

つまり、

  • たまたま存在するデータに頼ってテストが通う
  • データが消えたり変わったりすると、突然落ちる

が起きやすいです。なので、基本は避けるのが無難です。

SeeAllData=trueを使うのはどんな時?

原則は「最後の手段」です。

それでも使う可能性があるのは、ざっくり次のようなケースです。

  • テスト内で再現が難しい 設定/構造に強く依存している
  • 再現に時間がかかりすぎて現実的ではない
  • どうしても既存レコードを参照しないと検証できない

ただし、使う場合でも「参照条件を絞る」「更新しない」など、事故りにくい形に寄せるのが大事です。

FAQ(よくある疑問)

Q. SeeAllData=falseだと何も参照できない?

A. いいえ。少なくとも「組織の既存レコード(本番データ)」は参照できない、と考えるのが安全です。

必要なデータはテスト内で作る前提にすると安定します。

Q. SeeAllData=trueは使っちゃダメ?

A. 絶対ダメではないですが、テストがデータ依存になりやすいので原則は避けます。

使うなら「最後の手段」と割り切って、条件を絞って参照中心にします。

まとめ

  • @IsTest(SeeAllData=false) は 本番データに依存しないテストにする指定
  • テストに必要なレコードは テスト内で作るのが基本
  • SeeAllData=true は 環境差で壊れやすいので最後の手段

おすすめの記事