Salesforceテストクラスって何?設定方法や注意点をサンプルを用いてご紹介
IT・技術関連
更新日:2024.09.05
エンジニア採用
Salesforceにおけるテストクラスとは Salesforceにおけるテストクラスの概要について、サンプルコードを用いて説明します。今回のサンプルコードでは、テストカバー率が100%になるようにします。まず、サンプルコードを作成する前の手順から説明します。 「設定」という項目から「Quick Find (クイック検索)」というボックスに「Apex Classes (Apex クラス)」と入力し、「Apex Classes (Apex クラス)」を選びます。「New (新規)」を選択し、クラスエディタでクラスを定義しましょう。
Salesforceのテストクラスの概要
Salsforceにおけるテストクラスとは、作成したApexクラスが正しく動くのかどうか確認する機能のことです。テストクラスで品質を確認するときは、コードカバー率が100%になるようにします。 単体テストでもコードカバー率が100%を超えていて、テストクラスのすべてのメソッドを正しく動かせれば、リリースが可能です。Salesforceでは、Apexクラスを書ければ、テストクラスを書くことができます。 テストクラスは、開発の品質保証のために行うものです。本番適応の際に異常が出ないかどうか確認します。例を用いた説明はサンプルコードを使用し、概要の章で説明します。サンプルコードの説明とコード
サンプルコードでは、最初にテストクラスで使う@setupアノテーションが含まれているメソッドで、テストデータを作ります。次にテストデータを自由に追加できるテストメソッド1を作ります。3つ目のメソッドでテストデータを更新です。@isTest
private class testclass{
// テストデータを作成するメソッド
@testSetup
static void setup() {
List testAccts = new List();
for ( Integer i=0;i<2;i++ ) {
testAccts.add(new Account(Name = 'MyTestAccount'+i, Phone ='333-878'+i));
}
insert testAccts;
}
// テストメソッド1
@isTest
static void testMethod1() {
//更新後の電話番号を確認
Account acc0 = [SELECT Id,Phone FROM Account WHERE Name ='MyTestAccount0' LIMIT 1];
acc0.Phone = '888-1515';
update acc0;
Account acc1 = [SELECT Id,Phone FROM Account WHERE Name ='MyTestAccount1' LIMIT 1];
acc1.Phone = '999-1515';
update acc1;
System.debug('●acc0.Phone● = '+ acc0.Phone);
System.debug('●acc1.Phone● = '+ acc1.Phone);
}
テストメソッド2
次にテストメソッド2を作成します。@setupで作成したテストデータを5つ目のメソッドで取得するのです。最後のメソッドで、Test.startTest〜Test.stopTest間でガバナ制限がリセットされているか確認します。以下サンプルコードになります。 //テストメソッド2
@isTest
static void testMethod2() {
List accList = new List();
Account acc0 = [SELECT Id, Phone FROM Account WHERE Name ='MyTestAccount0' LIMIT 1];
Account acc1 = [SELECT Id, Phone FROM Account WHERE Name ='MyTestAccount1' LIMIT 1];
テストデータ取得
テストデータを取得します。//テストデータを取得
System.debug('Account0.Phone='+ acc0.Phone +', Account1.Phone='+acc1.Phone);
accList.add(acc0);
accList.add(acc1);
//getDMLStatementsでDML実行回数を確認
System.debug('●Start前●' + Limits.getDMLStatements() + '/' + Limits.getLimitDMLStatements());
System.Test.startTest();
System.debug('●Start後●' + Limits.getDMLStatements() + '/' + Limits.getLimitDMLStatements());
Database.DeleteResult[] results = Database.delete(accList, false);
System.Test.stopTest();
System.debug('●Stop後●' + Limits.getDMLStatements() + '/' + Limits.getLimitDMLStatements());
}
}
単体テスト作成
単体テストの場合、通常のテストクラスと同様に「設定」から「Quick Find (クイック検索)」というボックスに「Apex Classes (Apex クラス)」と入力し、「Apex Classes (Apex クラス)」を選びます。「New (新規)」を選択し、クラスエディタでクラスを定義しましょう。 単体テストの際は、1つ目のメソッド内が、public with sharingになっていた場合、privateにします。サンプルコードでは、入力値の華氏温度を摂氏温度に変換して結果を返すのです。今回は、3つのテストクラスで行います。以下サンプルコードになります。@isTest
private class TaskUtilTest {
@isTest static void testTaskPriority() {
String pri = TaskUtil.getTaskPriority('NY');
System.assertEquals('Normal', pri);
}
@isTest static void testTaskHighPriority() {
String pri = TaskUtil.getTaskPriority('CA');
System.assertEquals('High', pri);
}
@isTest static void testTaskPriorityInvalid() {
String pri = TaskUtil.getTaskPriority('Montana');
System.assertEquals(null, pri);
}
}
Salesforceにおけるテストクラスの注意点
Salesforceのテストクラスについていくつか注意点を説明します。テストクラスでは、小さな単位のメソッドの呼び出しをメインとし、テストデータの登録の際、トリガはスキップできるものにすることが大切です。 テストクラスで、テストデータを作ることを避けることはできません。しかし、テストクラス用のデータ作成時のトリガがエラーを起こすなど邪魔になることがあります。トリガの処理テストでない場合は、トリガをスキップする処理を書きましょう。 また、カスタムウェブサービスのときはメソッドを実行し、トリガの場合は必要なマスタを用意します。対象となるオブジェクトレコードを作成、更新、削除などを実行します。 コントローラーはVisualforceページでパラメータを指定して、コントローラーのメソッドを実行するなどの手順でテストしていくことが多いですが、コードはできるだけ簡単にするとよいでしょう。Salesforceのテストクラスに関する注意点のサンプルコード
サンプルです。public class SampleController { public Case caseObj {get; set;} String caseId; public APC_CUS_200_ShinchokuDetailCtrl(){ caseId = ApexPages.currentPage().getParameters().get('caseId'); } public void doinit(){ caseObj = [Select Id ,Type ,Origin ,Subject ,Priority ,ParentId ,AccountId From Case where id = :caseId ]; } public PageReference doSomething() { Account acc = getAccount(); Case parentcase = getParentCase(); doCheck(acc, parentcase); }
コントロールクラス
コントロールクラスの続きになります。private Account getAccount(){ if( caseObj.AccountId == nul ){ return null; } else { return [Select Id ,Name ,Industry From Account where ID =:caseObj.AccountId][0]; } } private Case getParentCase(){ if( caseObj.ParentId == nul ){ return null; } else { return [Select Id ,Type ,Origin ,Subject ,Priority From Case where ID =:caseObj.ParentId][0]; } }
コントロールクラスの続き
コントロールクラスの続きになります。@TestVisible private void doCheck(Account acc,Case parentcase){ if( caseObj.Origin != parentcase.Origin ){ ・・・・・ } if( acc.Industry == 'Education' && parentcase.Origin == 'Phone' ){ ・・・・・ } } }
テストクラスのサンプルコード
テストクラスに関するサンプルコードになります。簡略化をしたコードの作成例です。//テストクラス @isTest private class SampleControllerTest { static testMethod void testMethod01() { SampleController ctrl = new SampleController(); Case caseobj = new Case(); Case parentcase = new Case(); Account acc = new Account(); //必要なマスタの値のセットをする。 ctrl.caseObj = caseobj; ctrl.doCheck(acc, parentcase); } }
トリガスキップのサンプルコード
トリガスキップのサンプルコードになります。//トリガスキップの例 //カスタム表示ラベルを制御する trigger SampleiTrigger on Sample__c (after delete, after insert, after undelete, after update, before delete, before insert, before update) { if(System.Label.IKOFLAG == 'TRUE'){ return; } //処理
ユーザプロファイルを制御するサンプルコード
ユーザプロファイルを制御する部分のサンプルコードです。//ユーザプロファイルを制御する trigger SampleiTrigger on Sample__c (after delete, after insert, after undelete, after update, before delete, before insert, before update) { User u = [select Profile.Name from User where Id =:Userinfo.getUserId()]; if(u.Profile.Name == '移行'){ return; }
カスタムオブジェクトの項目を制御するサンプルコード
カスタムオブジェクト項目の制御する処理になります。//カスタムオブジェクト項目の制御する trigger SampleiTrigger on Sample__c (after delete, after insert, after undelete, after update, before delete, before insert, before update) { Boolean triggerskip = false; for( Sample__c s : Trigger.New ){ if( s.TriggerSkipFlag__c ){ triggerskip = true; //trueの場合、更新したトリガがスキップすることを防ぐため、フラグは常にfalseに戻す s.TriggerSkipFlag__c = false; } }
カスタムオブジェクトの項目を制御するサンプルコードの続き
フラグをたてて、トリガのスキップを細かく設定しましょう。if ( triggerskip ){ //afterトリガ用にstatic変数にトリガスキップのフラグをたてる。 Cls_StaticValue.triggerskip = true; } if( triggerskip || Cls_StaticValue.triggerskip ){ return; }
単体テストを作成する場合
単体テストを行う場合でもSalesforceで開発したApexクラスは単体テスト用のクラスで作成する必要があります。テストコードを作成しないと、本番でリリースできません。 開発したApexクラスは、単体テストでカバー率75%を超えるようにしなくてはなりません。また、Apexトリガはテストコードを用意する必要があります。単体テストに限らず、テストデータはユーティリティクラスか静的リソースを使用するとよいでしょう。 単体テストに限らず、System.debugはApexコードカバー率から外れます。テストメソッドでは、トランザクションを保持することができません。IsTest(SeeAllData=true)を使うと、組織のデータにアクセスすることも可能です。 しかし、価格表などのデータは他のメソッドを使用しないとアクセスができません。Salesforceのテストクラスを活用しよう
今回は、Salesforceにおけるテストクラスについて紹介しました。Salesforceでテストクラスを作るときは、Apexを使用することで作成できます。テストクラスは、開発の品質確認をするための機能です。 本番適応の際に異常は出ないかどうか確認でき、トラブルを回避することができます。Apexで製品を開発するのに使用する機会も多いので、理解して活用できるようにしましょう。]]>
この記事の監修者・著者
- ITエンジニア派遣サービス事業を行っています。AWSやSalesforceなど専門領域に特化したITエンジニアが4,715名在籍し、常時100名以上のITエンジニアの即日派遣が可能です。
・2021年:AWS Japan Certification Award 2020 ライジングスター of the Year 受賞
・2022年3月:人材サービス型 AWSパートナー認定
・AWS認定資格保有者数1,154名(2024年6月現在)
・Salesforce認定コンサルティングパートナー
・Salesforce認定資格者276名在籍(2024年5月現在)
・LPIC+CCNA 認定資格者:472 名(2024年6月時点)最新の投稿
- 2024-07-01営業インタビュー最短で当日にご提案可能。 OPE営業の対応が早い3つの理由
- 2024-07-01営業インタビュー研修見学ツアーが高評価!「お客様のOPEに対する期待を高め、継続に貢献できればと思います。」
- 2024-07-01営業インタビュー信頼関係を構築し、エンジニアの長期就業へ
- 2024-06-30キャリアインフラエンジニアはやめとけって本当?きつい理由を口コミを交えて解説
ITエンジニアの派遣を利用したい企業様へ
- 求人・転職サイトや自社採用サイトを使っているが、自社に合ったITエンジニアが応募してこない…
- すぐに採用したいが、応募がぜんぜん集まらない
こんな悩みをお持ちの採用・人事担当者の方は、
オープンアップITエンジニアをご検討ください!
オープンアップITエンジニアをご検討ください!
当社のITエンジニア派遣サービスは
- 派遣スピードが速い!(最短即日)
- 4,500名のエンジニアから貴社にマッチした人材を派遣
- 正社員雇用も可能
こんな特長があり、貴社の事業やプロジェクトに合った最適なITエンジニアを派遣可能です。
まずは下記ボタンから無料でご相談ください。