Apex Test 코드를 작성할 때 필요한 데이터를 만드는 것은 중요하다.@IsTest(SeeAllData=true) 어노테이션을 사용하면 해당 org의 실제 데이터에 접근이 가능하지만 test data의 isolation을 지향하는 Salesforce에서는 사실상 정말 특수한 경우가 아니면 사용하지 않는다. 만약 test data가 그 테스트 코드가 실행되는 환경의 실제 데이터에 의존하고 있다면, 이는 특히 다른 salesforce org로 배포를 할 때 실패할 가능성이 커지게 된다.
Test Data를 생성하는 방법은 몇가지가 있다. 주로 사용되는 패턴은 다음과 같다.
- @TestSetup 어노테이션을 사용하여 해당 테스트 클래스에서 모든 test method가 공용으로 사용할 데이터를 생성한다.
- TestDataFactory 패턴을 적용하여 데이터를 생성한다. Apex class 레벨에서 @IsTest 어노테이션을 적용시키면 그 클래스는 apex code size limit에 포함이 되지 않고, 오로지 test class들에서만 사용할 수 있다.
- static resource에 csv 파일을 올려두고
Test.loadData()메서드를 사용하여 레코드를 생성한다. 많은 양의 레코드를 테스트 코드에서 필요하다면 이 방법이 제일 효율적이다. 그러나 필드 자체가 바뀌거나 picklist 값이 바뀌거나 등의 Object에 변화가 생겼다면 일일히 static resource의 csv 파일을 갱신해줘야 하는 번거로움이 있다.
이번 포스팅에서는 위 3번, static resource를 이용하여 테스트 데이터를 작성하는 방법에 대해서 알아본다.
현재 나는 Production에 올라간 Test class들을 리팩토링하고 있으며, 이 중 공통 로직들을 테스트함에 있어 매번 테스트 데이터들을 생성하는 코드를 작성하는게 너무 번거로웠다. 하여 이것을 좀 편하게 하고자 csv로 아예 테스트 데이터를 준비하게 되었다.
방법은 간단하다. 먼저 Test class에서 사용할 데이터를 csv파일로 저장한다. csv파일에 test data를 생성할 땐 우리가 일반적으로 건드릴 수 없는 CreatedDate나 LastModifiedDate와 같은 audit 필드들도 값을 지정하여 생성시킬 수 있다.
즉, 의도적으로 10년전에 생성된(것처럼 보이는) 데이터를 만들 수 있다.
엑셀을 이용하여 파일을 만들 땐 반드시 저장할 때 csv 확장자를 선택하자.
이후 아래와 같이 static resource에 파일을 업로드 한다.

Apex 코드에서는 아래와 같이 사용한다. 주의할 점은, loadData()의 두 번째 파라미터로 static resource의 이름을 지정해야 한다. csv 파일 이름이 아니다!!
List<sObject> ls = Test.loadData(User.sObjectType, 'testUserRecordCSV');
이를 Test Data Factory 패턴과 함께 사용하면 반복되고 긴 테스트 데이터 생성용 코드들을 간결하게 바꿀 수 있다.
'Salesforce > Salesforce Dev' 카테고리의 다른 글
| Comparable Interface (0) | 2024.05.24 |
|---|---|
| Apex Null Coalescing Operator (0) | 2024.05.12 |
| Salesforce Apex Debug Log (세일즈포스 Apex 디버그 로그) (0) | 2024.04.01 |
| Salesforce LWC Debug Mode (Troubleshooting for LWC) (0) | 2024.03.30 |
| Salesforce Constants Management (상수값 관리, 하드코딩) (2) | 2024.03.22 |