Apex 테스트 클래스

클래스 정의



SeeAllData=true로 하면 기존의 데이터를 참조할 수 있게 되지만, 통상은 false로 한다(ConnectAPI라든지 일부의 기능은 true가 아니면 실행할 수 없기 때문에 주의)
@isTest(SeeAllData=false)
private class Ron_xxxControllerTest {

    @isTest 
    static void runProperties() {

    //testMethod の仕様は非推奨になっているため使わない。@isTestを使う
    public static testMethod void testXXX(){


테스트 방법의 병아리


/*
 * target function:
 */ 
@isTest 
static void testXX() {
    //prepare user
    User u1 = TestUtil.createUser('test1');

    //execute and assert
    System.runAs(u1){
        //prepare test data

        //execute test
        Test.startTest();

        System.assertEquals(expected, actual);
        Test.stopTest();
    }
}

assert


System.assertEquals(期待値, 実際の値);System.assert(評価の式);

테스트용 GET 파라미터 설정


ApexPages.currentPage().getParameters().put('xxxItemId', '');

start/end



start와 stop를 세트로 사용하는 것. start와 stop 사이에서만 거버너 제한이 카운트되고 데이터 준비를 위한 코드 실행분이 카운트되지 않는다.
Test.startTest();
・・・
Test.stopTest();

runAs



특정 사용자 컨텍스트 하에서 테스트를 수행한다.
User u1 = createTestUser();
System.runAs(u1){
 ・・・
}

맞춤 설정



SeeAllData = false 환경에서는 사용자 정의 설정에도 데이터가 설정되지 않습니다. 테스트 방법 내에서 데이터를 준비해야 함
public static xxx_Properties__c prepareCustomSettings(){
    xxx_Properties__c settings = new xxx_Properties__c();
    settings.Name = 'XXX';
    settings.email = 'aaa@aaa.com';
    insert settings;

    return settings;
}

VF 확장 컨트롤러 테스트 StandardController


//StandardControllerをnewして、コントローラに渡す
XX__c instance = new XX__c();
instance.xx__c = '123';
Apexpages.Standardcontroller sc = new Apexpages.Standardcontroller(instance);

XX_VF_Ctrl contl = new XX_VF_Ctrl(sc);


트리거의 Validation 체크 테스트 (addError ()를 사용하는 경우)


try{
    insert c1;  //error
    System.assert(false); //例外が発生すべき
}catch(DmlException e)
}

테스트 시 자동 번호 매기기 증가를 방지하는 옵션



[개발]-[Apex 테스트 실행]-[옵션]
'독립 자동 번호 매기기 순서' 확인


테스트 사용자 생성 코드


/*
 * create a test user
 *  name: firstName
 */
public static User createUser(String name){
    Profile profile = getStandardProfile();
    String profileId = profile.id;

    User user = new User();
    user.Email = name + 'test@xx.xxx.com';
    user.UserName = name + 'test@xx.xxx.com';
    user.FirstName = name;
    user.LastName = '123';
    user.Alias = user.UserName.split('@')[0].left(8);
    user.ProfileId = profileId;
    //user.UserRoleId = role.Id;
    user.EmailEncodingKey = 'ISO-2022-JP';
    user.LanguageLocaleKey = 'ja';
    user.LocaleSidKey = 'ja_JP';
    user.TimeZoneSidKey = 'Asia/Tokyo';
    insert user;
    user = [select Name, UserName, FirstName, LastName, Alias, UserRoleId, ProfileId, CreatedDate from user where UserName = :user.Username limit 1];

    return user;
 }

/*
 * get Profile of standard user
 */ 
public static Profile getStandardProfile(){
    Profile[] profiles;
    profiles =  [select Id From Profile where Name = '標準ユーザ' limit 1];
    if (profiles.isEmpty()){
       profiles =  [select Id From Profile where Name = 'Standard User' limit 1];
    }
    return profiles[0];
}

테스트 실행 시 개인 테스트에 액세스할 수 있도록 허용


@TestVisible 붙이기

테스트 실행 시 특정 코드 블록을 실행하지 않도록 합니다.


if (!Test.isRunningTest()) { 
    ....
}

MIXED_DML_EXCEPTION 해결 방법



User나 UserRole에 대한 DML과 그 이외의 객체에 대한 DML을 같은 트랜잭션으로 실행하고 있는 것이 이유.
설명

테스트 클래스에서 해결 방법은 System.runAs를 사용합니다.
//use System.runAs block in order to avoid MIXED_DML_EXCEPTION
User thisUser = [SELECT Id FROM User WHERE Id = :UserInfo.getUserId()];
System.runAs (thisUser){
    ....
}


Standard PriceBook ID를 얻는 방법



테스트 클래스에서 PricebookEntry()를 만들고 싶다면 아래의 숫자로 표준 가격표의 ID를 가져옵니다.
Id pricebookId = Test.getStandardPricebookId();
PricebookEntry pbe = new PricebookEntry();
pbe.Product2Id = someProduct.Id;
pbe.Pricebook2Id = pricebookId;
pbe.UnitPrice = 0;
pbe.IsActive = true;
insert pbe;

좋은 웹페이지 즐겨찾기