【Salesforse】【テストクラス】使ってる？TestSetup アノテーション

**TestSetup アノテーション**
Salesforce開発者のなかでも使っている人を見るほうが少ない印象、、
けど使ったほうが絶対いいと思うので個人的に布教しています(\*'ω'*)

# TestSetup アノテーションってなに
詳しくはTestSetup アノテーションの開発者ガイド↓を置いておくので読んでくだされ。

https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_annotation_testsetup.htm

この中に

>テスト設定メソッドで作成されたレコードは、テストクラス内のすべてのテストメソッドで使用でき

って書いてて、これが重要。


# データなんてテストメソッドごとに作ればいい？ほんとに？

ってことで中身は適当ですが、
TestSetup アノテーションを使用して取引先と商談のレコードを作るテストクラス
と
TestSetup アノテーションを使用せず、テストメソッドごとに取引先と商談のレコードを作るテストクラス
を簡単に書いてみました。

```Apex:TestSetup使用あり
@isTest
private class SetupTest {
    @TestSetup 
    static void setup(){
        // 取引先を作成
        Account acc = TestDataFactory.createAccount(true);
        // 商談を作成
        Opportunity opp = TestDataFactory.createOpportunity(acc.Id, true);
    }

    @isTest
    static void UpdateOpportunityTest1() {
        Opportunity opp = [SELECT Id FROM Opportunity LIMIT 1];

        Test.startTest();
        piepie001.UpdateOpportunity(opp.Id, 1);
        Test.stopTest();
    }

    @isTest
    static void UpdateOpportunityTest2() {
        Opportunity opp = [SELECT Id FROM Opportunity LIMIT 1];

        Test.startTest();
        piepie001.UpdateOpportunity(opp.Id, 2);
        Test.stopTest();
    }

    @isTest
    static void UpdateOpportunityTest3() {
        Opportunity opp = [SELECT Id FROM Opportunity LIMIT 1];

        Test.startTest();
        piepie001.UpdateOpportunity(opp.Id, 3);
        Test.stopTest();
    }

    @isTest
    static void UpdateOpportunityTest4() {
        Opportunity opp = [SELECT Id FROM Opportunity LIMIT 1];

        Test.startTest();
        piepie001.UpdateOpportunity(opp.Id, 4);
        Test.stopTest();
    }

    @isTest
    static void UpdateOpportunityTest5() {
        Opportunity opp = [SELECT Id FROM Opportunity LIMIT 1];

        Test.startTest();
        piepie001.UpdateOpportunity(opp.Id, 5);
        Test.stopTest();
    }
}
```

```Apex:TestSetup使用なし
@isTest
private class NoSetupTest {
    @isTest
    static void UpdateOpportunityTest1() {
        // 取引先を作成
        Account acc = TestDataFactory.createAccount(true);
        // 商談を作成
        Opportunity opp = TestDataFactory.createOpportunity(acc.Id, true);

        Test.startTest();
        piepie001.UpdateOpportunity(opp.Id, 1);
        Test.stopTest();
    }

    @isTest
    static void UpdateOpportunityTest2() {
        // 取引先を作成
        Account acc = TestDataFactory.createAccount(true);
        // 商談を作成
        Opportunity opp = TestDataFactory.createOpportunity(acc.Id, true);

        Test.startTest();
        piepie001.UpdateOpportunity(opp.Id, 2);
        Test.stopTest();
    }

    @isTest
    static void UpdateOpportunityTest3() {
        // 取引先を作成
        Account acc = TestDataFactory.createAccount(true);
        // 商談を作成
        Opportunity opp = TestDataFactory.createOpportunity(acc.Id, true);

        Test.startTest();
        piepie001.UpdateOpportunity(opp.Id, 3);
        Test.stopTest();
    }

    @isTest
    static void UpdateOpportunityTest4() {
        // 取引先を作成
        Account acc = TestDataFactory.createAccount(true);
        // 商談を作成
        Opportunity opp = TestDataFactory.createOpportunity(acc.Id, true);

        Test.startTest();
        piepie001.UpdateOpportunity(opp.Id, 4);
        Test.stopTest();
    }

    @isTest
    static void UpdateOpportunityTest5() {
        // 取引先を作成
        Account acc = TestDataFactory.createAccount(true);
        // 商談を作成
        Opportunity opp = TestDataFactory.createOpportunity(acc.Id, true);

        Test.startTest();
        piepie001.UpdateOpportunity(opp.Id, 5);
        Test.stopTest();
    }
}
```

# 実行速度を見てみましょう
念のため3回試行します。

### 1回目
TestSetup使用あり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/248b5f2c-96ee-73e1-a17f-0f5291960a47.png)

TestSetup使用なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/39233814-7773-6bd5-b961-bbb9b139f3c0.png)


### 2回目
TestSetup使用あり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/6fef6bdf-1849-1202-9ffd-d9738a18c117.png)

TestSetup使用なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/487109d1-ce31-1f43-b8ca-096a55d7392c.png)

### 3回目
TestSetup使用あり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/b7fb945e-15e2-2cc2-2cce-73904c2e2b26.png)

TestSetup使用なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/cf8dbada-eecf-6f0b-0fd9-7609899581d1.png)

### 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/20f17f98-a918-d677-2c3f-941463517004.png)
取引先と商談を1レコード作るだけでこの差です。
どちらが良いかは、言わずもがなですね！

# あとがき
テストクラスに関しては思想強めのぴえさんです。
ネタはいくつかあるので他にも書いてまとめる予定(\*'ω'*)