Use Case -
Tired of writing many lines of codes just to create test data in test methods. Also, over the time, because of change in business requirement, you need to add/remove/modify fields from those test records. If yes, then Test.loadData() is best for you.
Say we want to write a test method, in which we need to insert account records and its associated contact records. Before Test.loadData(), the only option was to create explicit account records insert them and then create contact records. Also you need to establish relation between account & contact records. If you need 1000 account & 2000 contact records, you can assume how many line of codes you need to write just for creation of test records.
Solution -
Use Test.loadData() to create records using csv file and using just a single line of code. Taking above problem in mind, let us discuss how to do it. Let us first create a new field (FakeId ) (API Name - FakeId__c) on both Account & a new field (Fake ParentId) (API Name - Fake_ParentId__c) Contact objects. To keep things simple, keep the data type of this field on both Account & Contact object same (say Integer with lenght 5). Next step, let's create two different csv files. In both files we will have value of fields of respective objects. First row in both csv files will have API Name of fields for which we are inserting records. Remember to have value for FakeId in Account & Fake ParentId for contact. Also, as per your requirement map value of FakeId in Account with Parent FakeId in Contact. Sample csv files may look like below.
For Account:-
For Contact: -
Now, we need to save these csv files in static resource with names say AccountCSV & ContactCSV. As soon as you will call belows:-
List<sObject> ls = Test.loadData(Account.sObjectType, 'AccountCSV');
Salesforce will insert test records from AccountCSV csv file and load that in list. For creating relation between account & contact records, you can use FakeId something like below:-
Hi I tried using Test.loadData but the tests are failing in the packaging org as it has namespace, with the error message that the field does not exists.
ReplyDeleteAny helpis appreciated. Thanks in advance !!
Why would you create a fake Id field, then iterate over what you just loaded, establish the relationship, then update the records when you can just populate the standard Id field and reference it during the data load?
ReplyDeleteAdd a column for Id on the Account CSV and populate it with TestAccount1, TestAccount2, and TestAccount3. Then add an AccountId field to the Contact CSV and populate it with TestAccount1, TestAccount2, and TestAccount3... It will achieve the same result without adding unnecessary fields, extra code, or requiring an update to records you just loaded.
If a solution ever seems to be overly complicated or particularly clever, you're doing it wrong.