Apexテストで Test.startTest(), Test.stopTest()を使う意味

silver imac displaying line graph placed on desk Apex
Photo by Serpstat on Pexels.com

Salesforce(Apex) のApexテストでは、Test.startTest() と Test.stopTest() という便利なメソッドがあります。この記事ではそれらを使う目的、有効な場面について紹介します。

目的1:ガバナ制限のテスト範囲を限定する

テストメソッドで、事前準備としていろいろレコードを Insert してから、テストしたいコードを書くとガバナ制限を超えてしまうことがあります。

でも実務においては、既にレコード等の準備はされている状況で処理を実行しますよね。
つまり実務における1回のトランザクション分のガバナ制限を満たしていることが確認できれば十分なわけです。

これをテストメソッドで実現するのがTest.startTest() と Test.stopTest() です。
Test.startTest() と Test.stopTest() で挟まれた部分は、新しいガバナ制限セットが割り当てられます。

// この部分は別のガバナ制限セット
// テストのためのレコードの準備など

Test.startTest();
// この間のコードには新しいガバナ制限セットが割り当てられる
// 実務での1回のトランザクションに相当する処理を記述する
Test.stopTest();

目的2:非同期処理を同期処理として扱う

一括処理バッチなどの非同期処理をテストする場合、非同期処理が終わらないまま System.assert() などの判定が行われてしまい、正しくテストすることができません。

このような場合にも Test.startTest() と Test.stopTest() が有効です。
この間に非同期処理を書くことで、同期処理のように扱うことができます。

Test.startTest();
SampleBatch batch = new SampleBatch();  // 一括処理バッチなどの非同期処理
Database.executeBatch(batch)
Test.stopTest()

System.assertEquals('aaa', hoge);       // バッチ処理が終わった状態で判定処理ができる

まとめ

Test.startTest(), Test.stopTest() を使う意味は以下の2つ

  • ガバナ制限のテスト範囲を限定する
  • 非同期処理を同期処理として扱う

逆に言えば、このような目的がなければ意味がありません。使い方をよく理解してテストを書いていきましょう!

コメント

タイトルとURLをコピーしました