今回はテストクラスについて。
なかなか苦労しがちなテストデータ作成で知っておいて損はないテクニックです。
今回は簡単な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ファイルの静的リソースは扱えない


コメント