今回はテストクラスについて。
なかなか苦労しがちなテストデータ作成で知っておいて損はないテクニックです。
今回は簡単なApexクラスのテストクラスを作成
以下のように、取引先の従業員数と取引先責任者数をデバッグログに表示するユーティリティクラスを用意します。
AccountUtil.cls
public class AccountUtil { public static void readAccountAndContcts(){ List<Account> accList = [Select Id, Name, NumberOfEmployees, (Select Id, LastName From Contacts) From Account]; for(Account a : accList){ Integer contacts = a.Contacts.size(); // 取引先の従業員数と責任者数をデバッグログに出力 String msg = a.Name + ' has ' + String.valueof(a.NumberOfEmployees) + 'Employees and ' + String.valueof(contacts) + 'Contacts.'; System.debug(msg); } } }
このクラスのテストクラスを作成する訳ですが、今回はテストクラスの中でInsertをかけるのではなく、静的リソースを使ってテストデータを取り込むやり方をします。
静的リソースからテストデータ作成
そのためには、まずは、テストデータとなるcsvファイルを作成します。
AccountData.csv
Name | NumberOfEmployees |
---|---|
hoge1 | 100 |
hoge2 | 200 |
hoge3 | 300 |
これを、静的リソースとして登録します。
ここで、MIMEタイプがtext/csvとなっていることを確認しましょう。
これをテストデータとして取り込む場合は、Test.loadDataを使用します。
第一引数に、オブジェクトタイプ、第二引数に先ほど登録した静的リソース名を指定します。
戻り値に、登録されたオブジェクトのリストを返却しますが、必要に応じて受け取りましょう。
Test.loadDataで読み込まれたレコードはこの時点でDBにInsertされているので、取得したリストに対してInsert処理をかける必要はありません。
@IsTest
static void accountDataTest() {
List<Account> accList = Test.loadData(Account.sObjectType, 'AccountData');
//Test.loadData時にInsertされるので、ここでInsertする必要はない
//insert accList;
Test.startTest();
AccountUtil.readAccountAndContcts();
Test.stopTest();
}
データ作成後は、いつものようにApexクラスのテストを実施すればOKです。
テスト結果は以下のようになり、きちんとデータが取り込まれていることがわかります。
応用編:リレーションをはる
次はちょっと応用編。
取引先の他に、取引先と紐づく取引先責任者も静的リソースを使って取り込むことにします。
まずは、取引先の静的リソースから。
データ自体は変わりませんが、紐付けのためにIDをつけましょう。この時のIDは一意となっていればOKで自分でつけたもので構いません。
AccountData2.csv
ID | Name | NumberOfEmployees |
---|---|---|
1 | hoge1 | 100 |
2 | hoge2 | 200 |
3 | hoge3 | 300 |
次に、取引先責任者の静的リソースです。
こちらは、以下csvで登録します。紐付け対象となるAccountIdには自分でつけたIDを指定します。
ContactData2.csv
LastName | AccountId |
---|---|
ichiro | 1 |
jiro | 1 |
saburo | 2 |
shiro | 3 |
goro | 3 |
rokuro | 3 |
そして、ソースコードはこのようになります。
先ほどと変わっているところは、取引先責任者の静的リソースの取り込み処理を追加しているのみ。
紐付け処理自体は、IDさえ合わせておけば、Test.loadDataが自動でやってくれます。
なかなかの神機能ですね!
@IsTest static void accountDataTest2() { List<Account> accList = Test.loadData(Account.sObjectType, 'AccountData2'); List<Contact> contactList = Test.loadData(Contact.sObjectType, 'ContactData2'); Test.startTest(); AccountUtil.readAccountAndContcts(); Test.stopTest(); }
そして、テスト実行。
このように、リレーションもはられていることがわかります。
注意点
このようにリレーションも貼ることができるTest.loadDataですが、扱える静的リソースには制限があります。
静的リソースを登録した時にファイルタイプに応じてMIMEタイプが設定されますが、
Test.loadDataの場合は、以下の4つしかサポートされません。
- text/csv
- application/vnd.ms-excel
- application/octet-stream
- text/plain
csvやExcelには対応していますが、csvファイルをzipファイルに固めた場合は使えないので、固めずにそのままcsvとして登録する必要があります。
まとめ
- Test.loadDataで静的リソースからデータ取り込みができる
- IDは任意で設定でき、IDを合わせることでリレーションの設定もできる
- zipファイルの静的リソースは扱えない
コメント