Apex 単体テスト
Apex テストクラス作成の考慮事項
・System.debugはApexコードカバー率の対象外です。
・Apexコードは単体テストでカバー率が75%を超えている必要があります。
・テストデータはユーティリティクラスで作成するか、静的リソースを使用して保持した方がいいです。
・テストメソッド間ではトランザクションは保持されません。
・IsTest(SeeAllData=true)を使用すれば、組織の実データにアクセスできますが、価格表などの一部データは他のメソッドを使用する必要があります。
テストクラス雛形 (Apex)
@isTest
private class XXXXXXTest {
@testSetup
static void setup() {
// 各テストメソッドで使用できるテストデータを作成する
}
@isTest
static void XXXTest() {
System.runAs(new User(ID = UserInfo.getUserID())) {
/* ======テストメソッド起動====== */
Test.startTest();
// 対象メソッドを呼び出す
Test.stopTest();
/* ======結果検証====== */
// 期待値と実行結果の検証
System.assertEquals(expected, actual);
}
}
}
テストアノテーション
@isTest アノテーション
アプリケーションのテストに使用するコードのみを含むクラスおよびメソッドを定義するには @isTest アノテーションを使用します。
@testSetup アノテーション
これを利用するとテストクラス内の各テストメソッドで使用できるテストデータを作成することが可能です。これにより処理が効率化されテスト実行時間を短縮することが可能になります。
テストメソッド「setup()」で作成された Salesforce レコードは、データベースにコミットされません。テストの実行が終了すると、レコードはロールバックされます。
System.runAs()
System.runAsでテスト対象のユーザを指定する
System.runAs無しで実行すると、システム実行となり権限を考慮したテストが出来なくなります。
なので、必ずSystem.runAsにてテスト対象のユーザを指定して実行します。
Test.startTest() と Test.stopTest()
テスト対象の処理を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); // バッチ処理が終わった状態で判定処理ができる
System assertはアサーションを検証するメソッド
Systemクラスの assertEquals、assertNotEqualsは、プログラムが実行する動作の検証に使用できます。
SystemクラスのassertEquals
SystemクラスのassertEqualsは、最初の2つの引数が一致することを確認します。結果が一致しない場合は、エラーを返してコードの実行を停止します。
SystemクラスのassertNotEquals
SystemクラスのassertNotEqualsは、最初の2つの引数が一致しないことを確認します。結果が一致する場合はエラーを返し、コードの実行を停止します。