【Salesforce】Apexテストクラス開発で使うアノテーション「@IsTest」とは何かまとめてみた

@IsTest(SeeAllData = false);とは?

@IsTest(SeeAllData = false)は、Apexのテストクラスやテストメソッドに使用されるアノテーションです。このアノテーションは、テストの実行時に本番データ(既存の組織データ)へのアクセスを制御するために使われます。
要は、テストをするときに「本物のデータ」を使わないようにするための設定です。

例えば、あなたが新しいゲームを作ったとします。
でも、そのゲームを試すときに、他の人が遊んでいる「本当のゲームデータ」を使ってテストしたら、
間違ってその人のセーブデータを壊してしまうかもしれません。
そこで、テストのときだけ特別な「テスト用データ」を作って、それで試してみることにします。
これなら、他の人のデータに影響を与えずに、ゲームがちゃんと動くかどうかを確認できます。

@IsTestだけを使った場合、SeeAllDataの値はどうなる?

@IsTestだけを使った場合、SeeAllDataの値は自動的にfalseが設定されます。
ということは、「明示的にSeeAllDataを設定する必要ない?」と思いますが、
その通りで特に理由がなければ、デフォルトの @IsTest(SeeAllData=false) を使って
テストを書くのが一般的です

解説

@IsTest:

Apexのクラスやメソッドをテストとしてマークするアノテーションです。これを付けることで、そのクラスやメソッドがテスト用コードであることをSalesforceに知らせます。

SeeAllData = false:

このオプションをfalseに設定すると、テストクラスやメソッドの中で、組織に存在する本番データ(既存のレコード)にアクセスできなくなります。つまり、テストクラス内で独自に作成したデータのみを使用してテストを行うことになります。
これにより、テストが本番データに依存せず、独立して正確に動作することが保証されます。例えば、特定のデータが本番環境に存在しない場合でもテストが失敗しないようにするための設定です。

サンプルソース


以下は@IsTest(SeeAllData = false)を使用したテストクラスのサンプルです。

@IsTest(SeeAllData = false)
public class AccountTest {
@IsTest
static void testAccountCreation() {
// テスト用にデータを作成
Account acc = new Account(Name = 'Test Account');
insert acc;

// テスト対象メソッドの呼び出しなどを行う
// 例えば、Accountの数が正しく増えているか確認する
System.assertEquals(1, [SELECT COUNT() FROM Account WHERE Name = 'Test Account']);
}
}

利点

データの独立性:

本番データが変わってもテスト結果に影響を与えないため、安定したテストが可能です。

セキュリティ:

本番データへのアクセスを制限することで、テストが本番環境のデータを変更するリスクを避けられます。

SeeAllData = falseを指定することは、ベストプラクティスとされています。テストデータを明示的に作成し、テストが確実に期待どおりに動作するかどうかを検証できます。

@IsTest(SeeAllData = true)の場合はどうなる?

SeeAllData=trueと設定すると、テストクラス内で本番データ(既存の組織データ)にアクセスできるようになります。
これにより、テスト中に既存のレコードを参照したり、操作したりすることが可能です。
ただし、本番データを使うとテストの結果がデータに依存するため、テストの再現性が低くなるリスクがあります。
たとえば、データが変更された場合、同じテストでも結果が異なる可能性があるため、一般的にはSeeAllData=falseのままにして、テスト用に独自のデータを作成するのが推奨されている。

まとめると、SeeAllData=trueにすると本番データにアクセスできるようになりますが、テストの安定性や再現性を考えると、慎重に使うべきです。

@IsTest(SeeAllData = true)を使う場合ってどんな場合?

ここまでの説明をすると基本的に本番環境のデータに依存にするのはリスクあるから
「@IsTest(SeeAllData = true)」を使うことってあまりないという印象があるが、
ではどんな時に利用するか紹介します。

設定データに依存するテスト

たとえば、組織にグローバル設定オブジェクトがあり、その設定を基に特定のロジックが動作する場合、
テストでその設定データにアクセスする必要があるかもしれません。
このようなケースでは、SeeAllData=true を使用して既存の設定データにアクセスする必要があります。

既存のデータ構造を使用する場合

組織の標準オブジェクトや設定が複雑で、それらを再現するのが難しい場合、または時間がかかる場合、SeeAllData=true を使って既存のデータを利用することが考えられます。
たとえば、標準オブジェクトに多くのレコードが存在し、そのレコードに基づいて特定の機能をテストしたい場合です。

レポートやダッシュボードのテスト

レポートやダッシュボードに依存する機能のテストを行う場合、そのレポートやダッシュボードが既存の本番データを使用していることが多いです。
こうした場合、SeeAllData=true を使って、本番データを使用したテストを行うことがあります。

外部システム連携のテスト

外部システムとの連携で、特定の本番データを基にAPI連携の動作を確認する場合にも、SeeAllData=true が必要になることがあります。
ただし、SeeAllData=true を使うと、テストが本番データに依存するため、テストが環境によって異なる結果になる可能性があり、推奨されない場合が多いです。
可能であれば、SeeAllData=false のままテストデータを作成してテストを行うほうが安全です。

所感

「SeeAllData=true」を使用することは、時間がない場合に行うことがあるかもしれませんが、基本的には避けるべきです。なぜなら、本番データに依存するテストは、環境が異なるとテスト結果が予測できなくなる可能性があるからです。
もし本番データを使わざるを得ない場合でも、将来的なトラブルを避けるために、テストデータを作成して安全なテスト環境でテストを行うことが推奨されます。時間がないときでも、テストデータを作成してから行う方が長期的には安全で、予期せぬ問題を回避することができます。

なので、どうしてもやむを得ない理由がある場合は、使うべきだが基本的には避けるという意識を持っておくといいです。

まとめ

Salesforceの本番環境には、実際のビジネスで使っている大事なデータがたくさんあります。
このデータに影響を与えないように、テストするときは特別なテスト用データを使う設定をします。
それが、@IsTest(SeeAllData = false)です。

falseにすることで、本番のデータを使わず、テスト用のデータだけを使ってテストします。
これにより、他の人が使っているデータを間違って変更したり、壊したりする心配がなくなります。
つまり、テストは「本物のデータ」を使わずに安全に行いましょう、ということです。

まとめてみると割と当たり前のことを言っていると思うが、実際に現場で働いてみるとこういった当たり前のことが抜けていることがあるので、深掘りしておくことは大切だと思った。

では、また次の記事でお会いしましょう。

おすすめの記事