Sandboxの作成・更新時に行う作業を自動化する

Salesforceの開発をするにあたってSandboxは欠かせないものですが、このSandboxを作成・更新する際に毎回している作業はありませんか?
例えば

  • DevSandboxではオブジェクトのレコードは全て空になってしまうので、開発用に使うテスト用データを作成する
  • FullSandboxでは本番の実データがそのままコピーされてしまうので、自社のセキュリティルールに従い顧客データの名前やメールアドレスなどをマスクする
  • カスタム設定等に持っている外部システムへのエンドポイントをテスト用に変更する

こういったSandbox作成時にやっている作業を自動化できるのが、Spring'16でリリースされる「Sandbox の作成および更新後のスクリプトの実行」機能です。

今回はサンプルとなるApexクラスを作って、Sandbox作成時にテストデータを作成する例をご紹介します。

Sandbox作成時に動かしたいApexクラスを作る

まずはApexクラスを作ります。
Apexの開発は通常本番組織では行えないので、Sandbox上で作ることになります。
ポイントは"SandboxPostCopy"インタフェースを実装することです。

global class SampleSandboxCopy implements SandboxPostCopy {

    global void runApexClass(SandboxContext context) {
        List<Account> sampleData = new List<Account>();
        
        for(Integer i=0; i < 10; i++) {
            sampleData.add(new Account(Name='株式会社サンプル' + i));
        }
        
        insert sampleData;
    }
}

サンプルでは取引先のデータを10件ほど作っています。

テストクラスを作る

続いてはテストクラスです。

@isTest
class TestSampleSandboxCopy {

    static testMethod void testCopyScript() {
        // テスト準備
        SampleSandboxCopy targetClass = new SampleSandboxCopy();
        
        // テスト実行
        Test.testSandboxPostCopyScript(targetClass,					 // テスト対象クラス
                                       UserInfo.getOrganizationId(), // contextに渡す組織ID
                                       UserInfo.getOrganizationId(), // contextに渡すSandboxID
                                       'SampleDev');				 // contextに渡すSandbox名
        
        // 結果検証
        List<Account> results = [SELECT Id,Name FROM Account];
        System.assert(0 < results.size());
    }
}

テストメソッドでSandbox作成時の動作をさせるにはTest.testSandboxPostCopyScript()を使います。
第3引数でSandboxIDを渡しますが、ここでは適当な値が思いつかないので組織IDと同じ値を渡しています。

本番組織にデプロイする

作成したApexクラスを本番環境にデプロイします。
変更セットなり、デプロイツールなり好きなものを使いましょう。

Sandbox作成時に作成したApexクラス名を指定する

さて、ここまでで準備は完了しているので、後は実際にSandboxを作成・更新することになります。
本番組織の設定メニューからSandboxの作成画面を表示します。
今回は1個しか作れない組織&既にSandboxがあるので更新を実行します。

ウィザードを進めると次のようにApexクラスを入力する画面になるので、ここでSandboxPostCopyを継承した動作させたいApexクラスを指定します。

ちなみにSandbox有効化後に動作させたいApexがない場合は空白のまま進みます。

Sandboxが有効化されるとApexが動作してテストデータが作られる

有効化されたSandboxにログインして取引先を確認してみると、Apex内でinsertしたサンプルデータができ・・・ていない!?

リリースノートなどを確認しても、書き方としてはこれで問題ないはずなのですが・・
この後何度か実施してみたり、別組織でも試したのですが残念ながら結果は同じでした。
これについては引き続き調査を実施して、原因が分かりましたら記事をアップデートさせて頂きます。

【20160229追記】
本件、Salesforceサポートに確認したところ、製品側の問題ということでした。
近いうちに修正予定ということなので、動作確認ができましたらこちらに追記させて頂きます。

【20160408追記】
サポートから修正されたと連絡があり、今回のサンプルで動作することをが確認できました。
ちなみに作成されたテストデータを見て気付いたのですが、レコードの所有者が「自動化プロセス」となっていたので、共有ルールなどによるアクセス範囲を考える場合は、きちんとユーザーを指定してinsertした方がいいかもしれません。

まとめ

さて、強引に締めるために今回実施した手順をまとめさせて頂きます。

  1. "SandboxPostCopy"インタフェースを継承したApexクラスを作る
  2. テストクラスを作成する(Test.testSandboxPostCopyScript()を使って対象クラスを動かす)
  3. 作成したApexを本番組織にデプロイする
  4. Sandbox作成時に作成したApexクラスを指定する
  5. Sandboxが有効化されるとApexが動作してテストデータが作られる?

Spring'16のアップデートで組織で有効にできるSandbox数が増えることもあり、今まで以上にSandboxの活用が進むことと思いますが、このように手動でやっていた部分を自動化することで、より効率的にオペレーションをすることができます。
今回はテストデータの作成で検証してみましたが、他にもいろいろな手順を自動化できると思いますので試してみてください。