Skip to main content
10๋ถ„๋งŒ ์‹œ๊ฐ„์„ ๋‚ด์–ด ์ปค๋ฎค๋‹ˆํ‹ฐ ์„ค๋ฌธ์กฐ์‚ฌ์— ์ฐธ์—ฌํ•ด ์ฃผ์„ธ์š”. ์ง€๊ธˆ๋ถ€ํ„ฐ 7์›” 19์ผ๊นŒ์ง€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ฐธ์—ฌํ•˜์‹œ๋ ค๋ฉด ์—ฌ๊ธฐ๋ฅผ ํด๋ฆญํ•ด ์ฃผ์„ธ์š”.

Apex ํ…Œ์ŠคํŠธ์šฉ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ

ํ•™์Šต ๋ชฉํ‘œ

์ด ์œ ๋‹›์„ ์™„๋ฃŒํ•˜๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ…Œ์ŠคํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค์˜ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์„ค์ •์— ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฐธ๊ณ 

์ฐธ๊ณ 

ํ•œ๊ตญ์–ด๋กœ ํ•™์Šตํ•˜์‹œ๊ฒ ์–ด์š”? Trailhead playground์—์„œ ํ•œ๊ตญ์–ด๋กœ ์‹ค์Šต ๊ณผ์ œ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ , ๊ด„ํ˜ธ ์•ˆ์— ์ œ๊ณต๋œ ๋ฒˆ์—ญ์„ ์‚ฌ์šฉํ•ด ํƒ์ƒ‰ํ•ด ๋ณด์„ธ์š”. ์˜์–ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ค์Šต ๊ณผ์ œ ๊ฒ€์ฆ์ด ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ ์˜๋ฌธ์œผ๋กœ ํ‘œ์‹œ๋œ ๊ฐ’๋งŒ ๋ณต์‚ฌํ•ด ๋ถ™์—ฌ ๋„ฃ์Šต๋‹ˆ๋‹ค. ํ•œ๊ตญ์–ด ์กฐ์ง์—์„œ ์‹ค์Šต ๊ณผ์ œ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ, (1) ๋กœ์บ˜์„ ๋ฏธ๊ตญ์„ ๋ฐ”๊พธ๊ณ  (2) ์—ฌ๊ธฐ์— ์ œ์‹œ๋œ ์ง€์นจ์— ๋”ฐ๋ผ ์–ธ์–ด๋ฅผ ์˜์–ด๋กœ ๋ฐ”๊พผ ํ›„ (3) "Check Challenge(๊ณผ์ œ ํ™•์ธ)" ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋‹ค์‹œ ์ง„ํ–‰ํ•ด ๋ณด์„ธ์š”.

์›ํ•˜๋Š” ์–ธ์–ด๋กœ Trailhead ์‚ฌ์šฉํ•˜๊ธฐ ๋ฑƒ์ง€๋ฅผ ํ™•์ธํ•ด ํ˜„์ง€ํ™”๋œ Trailhead ๊ฒฝํ—˜์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

์ „์ œ ์กฐ๊ฑด

์•„์ง ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ด์ „ ์œ ๋‹› Apex ํŠธ๋ฆฌ๊ฑฐ ํ…Œ์ŠคํŠธ์˜ ์ „์ œ ์กฐ๊ฑด์„ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค ์ถ”๊ฐ€

ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ์„ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ํ˜ธ์ถœ๋กœ ๋Œ€์ฒดํ•˜์—ฌ ์ด์ „ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ํ…Œ์ŠคํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

TestDataFactory ํด๋ž˜์Šค๋Š” @IsTest๋ผ๊ณ  ์ฃผ์„์ด ์ถ”๊ฐ€๋œ ๊ณต๊ฐœ ํด๋ž˜์Šค์ด๋ฉฐ, ์‹คํ–‰ ์ค‘์ธ ํ…Œ์ŠคํŠธ์—์„œ๋งŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค์—๋Š” ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์„ค์ •๊ณผ ๊ฐ™์€ ์œ ์šฉํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋Š” ์กฐ์ง์˜ ์ฝ”๋“œ ํฌ๊ธฐ ์ œํ•œ์—์„œ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.

TestDataFactory ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š”.

  1. Developer Console์—์„œ File(ํŒŒ์ผ) | New(์ƒˆ๋กœ ๋งŒ๋“ค๊ธฐ) | Apex Class(Apex ํด๋ž˜์Šค)๋ฅผ ํด๋ฆญํ•˜๊ณ  ํด๋ž˜์Šค ์ด๋ฆ„์— ๋Œ€ํ•ด TestDataFactory๋ฅผ ์ž…๋ ฅํ•œ ๋‹ค์Œ OK(ํ™•์ธ)๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ธฐ๋ณธ ํด๋ž˜์Šค ๋ณธ๋ฌธ์„ ๋‹ค์Œ์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
    @IsTest
    public with sharing class TestDataFactory {
      public static List<Account> createAccountsWithOpps(Integer numAccts, Integer numOppsPerAcct) {
        List<Account> accts = new List<Account>();
        for(Integer i=0;i<numAccts;i++) {
          Account a = new Account(Name='TestAccount' + i);
          accts.add(a);
        }
        insert as user accts;
        List<Opportunity> opps = new List<Opportunity>();
        for(Integer j=0;j<numAccts;j++) {
          Account acct = accts[j];
          // For each account just inserted, add opportunities
          for(Integer k=0;k<numOppsPerAcct;k++) {
            opps.add(new Opportunity(Name=acct.Name + ' Opportunity ' + k,
              StageName='Prospecting',
              CloseDate=System.today().addMonths(1),
              AccountId=acct.Id));
          }
        }
        // Insert all opportunities for all accounts.
        insert as user opps;
        return accts;
      }
    }

์ด ํ…Œ์ŠคํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค์—๋Š” ํ•˜๋‚˜์˜ ์ •์  ๋ฉ”์„œ๋“œ createAccountsWithOpps()๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ณ„์ • ๊ฐœ์ˆ˜(numAccts ๋งค๊ฐœ๋ณ€์ˆ˜) ๋ฐ ๊ฐ ๊ณ„์ •์— ๋Œ€ํ•ด ์ƒ์„ฑํ•  ๊ด€๋ จ ๊ธฐํšŒ ๊ฐœ์ˆ˜(numOppsPerAcct ๋งค๊ฐœ๋ณ€์ˆ˜)๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฃจํ”„๋Š” ์ง€์ •๋œ ์ˆ˜์˜ ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ณ  accts ๋ชฉ๋ก ๋ณ€์ˆ˜์—์„œ ์ด๋Ÿฌํ•œ ๊ณ„์ •์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ฃจํ”„ ํ›„, insert DML ๋ฌธ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ชฉ๋ก์— ์žˆ๋Š” ๋ชจ๋“  ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ฃจํ”„๋Š” ๊ธฐํšŒ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฐ ๊ธฐํšŒ ๊ทธ๋ฃน์ด ํ•˜๋‚˜์˜ ๊ณ„์ •์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์™ธ๋ถ€ ๋ฃจํ”„๋Š” ๊ณ„์ •์„ ๋ฐ˜๋ณตํ•˜๊ณ  ํ˜„์žฌ ๊ณ„์ •์— ๋Œ€ํ•œ ๊ด€๋ จ ๊ธฐํšŒ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ค‘์ฒฉ ๋ฃจํ”„๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์— ์ค‘์ฒฉ ๋ฃจํ”„๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๊ธฐํšŒ๋Š” add() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ๋ชฉ๋ก์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ธฐํšŒ๋Š” AccountId ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์œ„ ๊ณ„์ •์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ๋ชจ๋“  ๊ธฐํšŒ์˜ ์ด ์ˆ˜๋Š” ๊ธฐํšŒ ๊ฐœ์ˆ˜์™€ ๊ณ„์ • ๊ฐœ์ˆ˜(numOppsPerAcct*numAccts์˜ ์ œ๊ณฑ๊ฐ’์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ, insert DML ๋ฌธ์€ ๋ฃจํ”„ ์™ธ๋ถ€์—์„œ ํšจ์œจ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜์–ด ํ˜ธ์ถœ ํ•œ ๋ฒˆ์œผ๋กœ ๋ชจ๋“  ๊ณ„์ •์— ๋Œ€ํ•œ ์ปฌ๋ ‰์…˜์˜ ๋ชจ๋“  ๊ธฐํšŒ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ด ๋ฉ”์„œ๋“œ๋Š” ์ƒˆ ๊ณ„์ • ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Note

์ด ๋ฐฉ๋ฒ•์ด ๊ด€๋ จ๋œ ๊ธฐํšŒ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋”๋ผ๋„ Apex ํŠธ๋ฆฌ๊ฑฐ ํ…Œ์ŠคํŠธ์˜ ํŠธ๋ฆฌ๊ฑฐ์— ์‚ฌ์šฉ๋œ ์ฟผ๋ฆฌ์™€ ๊ฐ™์ด Account์™€ Opportunity ๊ฐ„์˜ ๊ธฐ์กด ๊ด€๊ณ„๋ฅผ ํ™œ์šฉํ•˜๋Š” SOQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํ•ด๋‹น ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ์„ ์œ„ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

์ด์ œ ํ…Œ์ŠคํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฏ€๋กœ ์ด ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜๋„๋ก TestAccountDeletion ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. TestDataFactory.createAccountsWithOpps(1,1) ํ˜ธ์ถœ์— ์˜ํ•ด ๋ฐ˜ํ™˜๋œ ๋ฐฐ์—ด์—๋Š” ํ•˜๋‚˜์˜ Account sObject๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ˆ˜์ •๋œ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

@IsTest
private with sharing class TestAccountDeletion {
  @IsTest
  static void TestDeleteAccountWithOneOpportunity() {
    // Test data setup
    // Create one account with one opportunity by calling a utility method
    Account[] accts = TestDataFactory.createAccountsWithOpps(1,1);
    // Perform test
    Test.startTest();
      Database.DeleteResult result = Database.delete(accts[0], false, AccessLevel.USER_MODE);
    Test.stopTest();
    // Verify that the deletion should have been stopped by the trigger,
    // so check that we got back an error.
    Assert.isFalse(result.isSuccess());
    Assert.isTrue(result.getErrors().size() > 0);
    Assert.areEqual('Cannot delete account with related opportunities.',
      result.getErrors()[0].getMessage());
  }
}

๋‹ค์–‘ํ•œ ์กฐ๊ฑด์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ

ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋กœ๋Š” ํŠธ๋ฆฌ๊ฑฐ์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ž…๋ ฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐํšŒ๊ฐ€ ์—†๋Š” ๊ณ„์ •์ด ์‚ญ์ œ๋˜๋Š” ๊ฒฝ์šฐ์™€ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์กฐ๊ฑด์„ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹จ์ผ ๋ ˆ์ฝ”๋“œ ๋Œ€์‹  ๋Œ€๋Ÿ‰ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์„ธ ๊ฐ€์ง€ ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋œ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์˜ ์—…๋ฐ์ดํŠธ๋œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์ด ์—…๋ฐ์ดํŠธ๋œ ๋ฒ„์ „์˜ ํด๋ž˜์Šค๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

@IsTest
private with sharing class TestAccountDeletion {
  @IsTest
  static void TestDeleteAccountWithOneOpportunity() {
    // Test data setup
    // Create one account with one opportunity by calling a utility method
    Account[] accts = TestDataFactory.createAccountsWithOpps(1,1);
    // Perform test
    Test.startTest();
      Database.DeleteResult result = Database.delete(accts[0], false, AccessLevel.USER_MODE);
    Test.stopTest();
    // Verify that the deletion should have been stopped by the trigger,
    // so check that we got back an error.
    Assert.isFalse(result.isSuccess());
    Assert.isTrue(result.getErrors().size() > 0);
    Assert.areEqual('Cannot delete account with related opportunities.',
      result.getErrors()[0].getMessage());
  }
  @IsTest
  static void TestDeleteAccountWithNoOpportunities() {
    // Test data setup
    // Create one account with no opportunities by calling a utility method
    Account[] accts = TestDataFactory.createAccountsWithOpps(1,0);
    // Perform test
    Test.startTest();
      Database.DeleteResult result = Database.delete(accts[0], false, AccessLevel.USER_MODE);
    Test.stopTest();
    // Verify that the deletion was successful
    Assert.isTrue(result.isSuccess());
  }
  @IsTest
  static void TestDeleteBulkAccountsWithOneOpportunity() {
    // Test data setup
    // Create accounts with one opportunity each by calling a utility method
    Account[] accts = TestDataFactory.createAccountsWithOpps(200,1);
    // Perform test
    Test.startTest();
      Database.DeleteResult[] results = Database.delete(accts, false, AccessLevel.USER_MODE);
    Test.stopTest();
    // Verify for each record.
    // In this case the deletion should have been stopped by the trigger,
    // so check that we got back an error.
    for(Database.DeleteResult dr : results) {
      Assert.isFalse(dr.isSuccess());
      Assert.isTrue(dr.getErrors().size() > 0);
      Assert.areEqual('Cannot delete account with related opportunities.',
        dr.getErrors()[0].getMessage());
    }
  }
  @IsTest
  static void TestDeleteBulkAccountsWithNoOpportunities() {
    // Test data setup
    // Create accounts with no opportunities by calling a utility method
    Account[] accts = TestDataFactory.createAccountsWithOpps(200,0);
    // Perform test
    Test.startTest();
      Database.DeleteResult[] results = Database.delete(accts, false, AccessLevel.USER_MODE);
    Test.stopTest();
    // For each record, verify that the deletion was successful
    for(Database.DeleteResult dr : results) {
      Assert.isTrue(dr.isSuccess());
    }
  }
}

๋ชจ๋“  ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ ์‹คํ–‰

๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋Š” ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์—์„œ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ, ์ด์ œ ํด๋ž˜์Šค์— ๋” ํฌ๊ด„์ ์ธ ํ…Œ์ŠคํŠธ๊ฐ€ ํฌํ•จ๋˜๊ณ  ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ํŒฉํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ฆฌํŒฉํ† ๋ง๋˜์—ˆ์Šต๋‹ˆ๋‹ค. TestAccountDeletion ํด๋ž˜์Šค์—์„œ ์ด๋ฏธ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ–ˆ์œผ๋ฏ€๋กœ ์ด ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์—ฌ ๋ชจ๋“  ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋™์ผํ•œ ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด Tests(ํ…Œ์ŠคํŠธ) ํƒญ์„ ํด๋ฆญํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ์„ ํƒํ•œ ๋‹ค์Œ Test(ํ…Œ์ŠคํŠธ) | Rerun(์žฌ์‹คํ–‰)์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  2. ์ตœ์‹  ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ํ™•์žฅํ•˜์—ฌ Tests(ํ…Œ์ŠคํŠธ) ํƒญ์—์„œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์‹คํ–‰์€ ๋„ค ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ชจ๋‘ ํ†ต๊ณผ๋˜์—ˆ์Œ์„ ๋ณด๊ณ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค

Salesforce ๋„์›€๋ง์—์„œ Trailhead ํ”ผ๋“œ๋ฐฑ์„ ๊ณต์œ ํ•˜์„ธ์š”.

Trailhead์— ๊ด€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์˜๊ฒฌ์— ๊ท€ ๊ธฐ์šธ์ด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ œ Salesforce ๋„์›€๋ง ์‚ฌ์ดํŠธ์—์„œ ์–ธ์ œ๋“ ์ง€ ์ƒˆ๋กœ์šด ํ”ผ๋“œ๋ฐฑ ์–‘์‹์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ ์˜๊ฒฌ ๊ณต์œ ํ•˜๊ธฐ