静的リソースからテストデータ作成

今回はテストクラスについて。
なかなか苦労しがちなテストデータ作成で知っておいて損はないテクニックです。

スポンサーリンク

今回は簡単な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

これを、静的リソースとして登録します。

静的リソースにcsvを登録

ここで、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です。

テスト結果は以下のようになり、きちんとデータが取り込まれていることがわかります。

静的リソースcsvを取り込んだテスト結果

応用編:リレーションをはる

次はちょっと応用編。

取引先の他に、取引先と紐づく取引先責任者も静的リソースを使って取り込むことにします。

まずは、取引先の静的リソースから。

データ自体は変わりませんが、紐付けのためにIDをつけましょう。この時のIDは一意となっていればOKで自分でつけたもので構いません。

AccountData2.csv

ID Name NumberOfEmployees
1 hoge1 100
2 hoge2 200
3 hoge3 300

Account登録用の静的リソース登録

次に、取引先責任者の静的リソースです。

こちらは、以下csvで登録します。紐付け対象となるAccountIdには自分でつけたIDを指定します。

ContactData2.csv

LastName AccountId
ichiro 1
jiro 1
saburo 2
shiro 3
goro 3
rokuro 3

Contact登録用の静的リソース登録
そして、ソースコードはこのようになります。
先ほどと変わっているところは、取引先責任者の静的リソースの取り込み処理を追加しているのみ。
紐付け処理自体は、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ファイルの静的リソースは扱えない

コメント