function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
force_dev1force_dev1 

Apexコードからのバッチ処理のテストについて

Apexコードからバッチ処理を呼んでいるテストコードを作成しています。

 

Apex処理自体はすぐ終了するのですが

バッチ処理は時間差が発生しているため、テストコードで結果を確認するタイミングでは

まだバッチ処理が終了していません。

 

やりたいことはバッチ処理まで終了した結果をApexのテストコードで確認をしたいと考えています。

 

ご存知の方いらっしゃいましたら

ご教授願います。

 

サンプルをご提供頂けたら助かります。

 

説明が言葉足らずな部分がございますが

よろしくお願いいたします。

 

Best Answer chosen by Admin (Salesforce Developers) 
force_dev1force_dev1

ご説明いただきありがとうございます。

 

バッチ処理の起動についてですが、

画面上からボタン押下されたときにコントローラーが起動し、

そのコントローラー内でバッチを起動する作りになっております。

 

そのため、スケジューラーで起動せずに

コントローラーのテスト内でバッチ処理もテストをしたいといった内容でした。

 

<処理の流れ>

 ①画面でサンプルボタン押下

 ②SampleコントローラーのSampleHandlerメソッドを実行

 ③SampleHandlerメソッド内でバッチ処理起動(Database.executeBatch)

 

上記内容の処理についてテストコードを作成しています。

SampleコントローラーTestというクラスを作成しまして

SampleHandlerTestのメソッドのテストとして③の結果までを確認したいと考えています。

 

下記のようなテストコードを作成していますが、System.assertEqualsの段階で結果がfaultになっています。

やはりスケジューラーなどの設定が必要なのでしょうか。

@IsTest
class SampleControllerTest {
    static testMethod void sampleHandlereTest() {
        /* レコードの準備など */
 
        // テスト開始
        Test.startTest();
 
new SampleController cont = new SampleController()
cont.sampleHandlere(); // テスト終了 Test.stopTest();
// テスト結果の確認
// yyyyyyはバッチ処理まで完了した後の状態
System.assertEquals(xxxxx, yyyyyyy);
 } }

 

 


 


All Answers

s_takiis_takii

私もApexスケジューラを初めて実装している最中で、BlogやらApexマニュアルを参考に作ったものですが、こんなコードで即時実行できました。

テストコードについて詳しくは、このページで解説されています。

http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_scheduler.htm

 

サンプルコード:

final String cronExp = '0 0 * * * ?';	// 即時実行

// Apexクラスをスケジュールに登録
String jobId = System.schedule( 'testSchedule', cronExp,
    new SchedulerClassName() ); // 第3引数にテスト対象クラスを指定

// Get the information from the CronTrigger API object
CronTrigger ct = [SELECT Id, CronExpression, TimesTriggered, NextFireTime FROM CronTrigger WHERE id = :jobId];

// Verify the expressions are the same
System.assertEquals( cronExp, ct.CronExpression );

// Verify the job has not run
System.assertEquals(0, ct.TimesTriggered);

 

aki124aki124

Apexテスト内で、スケジューラの即時実行を行いたい場合には、Test.startTestメソッド、Test.stopTestメソッドを利用する必要があります。

 

リファレンスのTest Methodsを参照すると、startTest、stopTestの説明に下記のように記載されています。


All asynchronous calls made after the startTest method are collected by the system. When stopTest is executed, all asynchronous processes are run synchronously.

 

startTestとstopTestの間でスケジューリングしてあげれば、stopTestを実行した際に、スケジューリングした処理を実行してくれます。

@IsTest
class SampleSchedulerTest {
    static testMethod void testSchedule() {
        /* レコードの準備など */
 
        // テスト開始
        Test.startTest();
 
        /* スケジュールの設定など */
        /* スケジュールが実行されていないことの確認 */
 
        // テスト終了
        Test.stopTest();
 
        /* スケジュールが実行されたことの確認 */
    }
}

 

s_takiiのサンプルコードについても、大元のサンプルに従って、startTestとstopTestの間で実行されたのではないかと思います。

#一番最後の"Verify the job has not run"とコメントの付いた行では、一度も実行されていないことを確認されていますし・・・。

 

そもそものforce_dev1さんのご質問が、Apexスケジューラに関するものかどうかわかりませんので、ご期待に添える内容になっていないかもしれませんが、ご容赦ください。

s_takiis_takii

aki124さんご指摘の通り、startTestとstopTestの記述が必要です。(この辺は省略してました)

 

#一番最後の"Verify the job has not run"とコメントの付いた行では、一度も実行されていないことを確認されていますし・・・。

 

ほとんど拾ってきたサンプルコードそのままで疎通確認程度のものでした・・・。

まだデプロイもしてない開発途中のコードを元に解答するのは危険ですね。

ご指摘ありがとうございました。

force_dev1force_dev1

ご説明いただきありがとうございます。

 

バッチ処理の起動についてですが、

画面上からボタン押下されたときにコントローラーが起動し、

そのコントローラー内でバッチを起動する作りになっております。

 

そのため、スケジューラーで起動せずに

コントローラーのテスト内でバッチ処理もテストをしたいといった内容でした。

 

<処理の流れ>

 ①画面でサンプルボタン押下

 ②SampleコントローラーのSampleHandlerメソッドを実行

 ③SampleHandlerメソッド内でバッチ処理起動(Database.executeBatch)

 

上記内容の処理についてテストコードを作成しています。

SampleコントローラーTestというクラスを作成しまして

SampleHandlerTestのメソッドのテストとして③の結果までを確認したいと考えています。

 

下記のようなテストコードを作成していますが、System.assertEqualsの段階で結果がfaultになっています。

やはりスケジューラーなどの設定が必要なのでしょうか。

@IsTest
class SampleControllerTest {
    static testMethod void sampleHandlereTest() {
        /* レコードの準備など */
 
        // テスト開始
        Test.startTest();
 
new SampleController cont = new SampleController()
cont.sampleHandlere(); // テスト終了 Test.stopTest();
// テスト結果の確認
// yyyyyyはバッチ処理まで完了した後の状態
System.assertEquals(xxxxx, yyyyyyy);
 } }

 

 


 


This was selected as the best answer
force_dev1force_dev1

解決いたしました。

 

「Test.stopTest();」を記述している位置が悪かったため

バッチ処理の実行結果を取得できていませんでした。

 

ご回答ご説明をいただきまして

大変ありがとうございました。