* B:@testSetupinserts data once and shares it across all test methods in the class, saving system resources. * D:@isTest(SeeAllData=true)is incompatible with@testSetupdue to their differing purposes for managing test data. Reference:@testSetup Annotation Incorrect Options: A:Records can be updated in individual test methods. C:@testSetupdoes not execute repeatedly; it runs once per class.
最新のコメント (最新のコメントはトップにあります。)
`@testSetup` を利用する最大の目的は、ズバリ **「テスト実行時間の短縮(パフォーマンス向上)」** です。
それに加えて、**「コードをきれいに書く(保守性)」** という目的もあります。
わかりやすく、**「使わない場合」** と **「使う場合」** で比較してみましょう。
### 1\. なぜ速くなるのか?(イメージ比較)
例えば、テストクラスの中に「5つのテストメソッド」があり、すべてのテストで「共通の取引先データ」が必要だとします。
#### ❌ `@testSetup` を使わない場合(昔の書き方)
テストメソッドが実行されるたびに、データをイチから作り直します。
* テスト1開始 → **データ作成(Insert)** → テスト実行 → 終了
* テスト2開始 → **データ作成(Insert)** → テスト実行 → 終了
* ...(あと3回繰り返し)
* **結果:** 合計 **5回** も Insert が走るため、処理が遅い。
#### ⭕ `@testSetup` を使う場合
クラスの最初に1回だけデータを作ります。
* **`@testSetup` 開始 → データ作成(Insert) → 完了**
* テスト1開始 → 用意されたデータを使ってテスト → 終了(データはリセット)
* テスト2開始 → 用意されたデータを使ってテスト → 終了(データはリセット)
* ...
* **結果:** Insert は **1回** だけで済むため、爆速。
-----
### 2\. 3つの主なメリット
試験や実務で重要なポイントは以下の3点です。
#### ① テスト実行時間の劇的な短縮
Salesforceの処理の中で、データベースへの書き込み(DML)は特に時間がかかります。これを減らすことで、デプロイ時間を大幅に短縮できます。
#### ② ガバナ制限の節約
テストメソッド内でデータ作成を行うと、その分だけ「DML発行回数」や「CPU時間」を消費してしまいます。`@testSetup` で作ったデータ作成の負荷は、テストメソッドのガバナ制限カウントに含まれない(分離される)ため、**テスト本番の処理でガバナ制限をフルに使えます**。
#### ③ テスト間の「データ独立性」と「自動リセット」
ここが一番賢い機能です。
`@testSetup` で作ったデータは、各テストメソッドが終わるたびに、**「`@testSetup` が終わった直後の状態」に自動的に戻ります(ロールバック)**。
* **例:**
* セットアップで「名前: A」を作成。
* **テスト1:** 「名前: A」を「名前: B」に更新してテスト。 → OK!
* **テスト2...
正解は **B** と **D** です。
### 領域の確認
* **領域:** **4. テスト、デバッグ、およびリリース (Testing, Debugging, and Deployment)**
* **トピック:** Apex テストのデータ作成、`@testSetup` アノテーション
---
### 正解の解説
**B. テスト セットアップ メソッドでは、テスト データが 1 回挿入され、テスト クラス内のすべてのテスト メソッドで使用できるようになります。**
これが `@testSetup` を使う最大のメリットです。
通常、テストメソッドごとにデータを毎回 `insert` すると時間がかかりますが、`@testSetup` を使うと、**クラスの実行開始時に 1回だけ** データ作成処理が走り、そのデータがすべてのテストメソッドで使い回されます。
(※各テストメソッドの終了後、データは自動的に `@testSetup` 実行直後の状態にロールバックされるため、データの干渉は起きません。)
**D. @isTest(SeeAllData=True) アノテーションが使用されている場合、@testSetup アノテーションはサポートされません。**
これも正しい仕様です。
`SeeAllData=True` は「組織の本番データにアクセスする」設定であり、`@testSetup` は「テスト用の隔離されたデータを作る」設定です。これら2つは概念的に相反するため、同じクラス内で併用することはできません。
---
### 不正解の解説
**A. テストセットアップメソッドで作成されたレコードは、個々のテストメソッドでは更新できません。**
これは **不正解** です。
個々のテストメソッド内で、セットアップされたデータを取得し、**更新 (`update`) することは可能** です。
重要なのは、あるテストメソッド(例: `testMethod1`)でデータを更新・削除しても、次のテストメソッド(例: `testMethod2`)が始まるときには、**元の状態(セットアップ直後の状態)に戻っている(ロールバックされる)** という点です。更新自体が禁止されているわけではありません。
**C. @testSetup アノテーションで定義されたメソッドは、テスト クラス内の各テスト メソッドに対して 1 回実行され、...**
これは **不正解** です。
記述が逆です。`@testSetup` は **「クラス全体で 1回だけ」** 実行されます。「各テストメソッドに対して毎回実行される」のであれば、通常のヘルパーメソッドを呼ぶのと変わらず、パフォーマンス向上の恩恵がありません。
---
### 💡 図解:@testSetup の動き
...