2

JUnit を使用して Java バッチ ジョブをテストできますか? Junit はローカルで実行され、Java バッチ ジョブはサーバー上で実行されるため、JUnit テスト ケースからジョブを開始する方法がわかりません (JobOperator クラスを使用してみました)。

JUnit が適切なツールでない場合、Java バッチ コードを単体テストするにはどうすればよいでしょうか。

WAS Liberty で実行されている JSR 352 の IBM の実装を使用しています

4

2 に答える 2

2

@GhostCat からの回答に基づいて、テストで完全な仕事 (彼の箇条書き 1.) を実行する方法を尋ねているようです。(もちろん、リーダー/プロセッサ/ライター コンポーネントを個別に単体テストすることも役立ちます。)

基本的なオプションは次のとおりです。

  1. Arquillian (Arquillian と Liberty の使用を開始するためのリンクについては、こちらを参照) を使用してサーバーでテストを実行しますが、アプリをサーバーにデプロイして結果を収集するタスクは Arquillian に処理させます。

  2. JobOperator インターフェイスを介してジョブを駆動する独自のサーブレット ハーネスを記述します。出発点については、この質問に対する@aguibert の回答を参照してください。ジョブがサブミッターに通知する他の方法がない限り、「終了」状態 (COMPLETED、FAILED、または STOPPED) のいずれかについて JobExecution をポーリングする独自の単純なルーチンを作成する必要があることに注意してください。


覚えておくべきもう 1 つの手法は、スタートアップ Bean です。次のようなスタートアップ Bean を使用してサーバーを起動するだけで、ジョブを実行できます。

@Startup
@Singleton
public class StartupBean {

    JobOperator jobOp = BatchRuntime.getJobOperator();

    // Drive job(s) on startup.
    jobOp.start(...);        

これは、JobOperator インターフェイス (サーバーにいる必要がある) を使用するのとは別に、ジョブの結果を確認する方法がある場合に役立ちます。テストでは、単純にジョブの結果をポーリングして確認できます。HTTP ポートを開く必要さえなく、サーバーの起動オーバーヘッドはわずか数秒です。

于 2016-09-16T14:47:18.380 に答える
2

JUnit は、まず第一に、自動化およびテスト モニターフレームワークです。意味: これを使用して、あらゆる種類の @Test メソッドを駆動できます。

概念的な点から言えば、単体テストの定義はかなりあいまいです。ウィキペディアに従うと、「何かをテストするために行うすべてのこと」は単体テストと見なすことができます。もちろん、その観点に従って、バッチ フレームワークで実行されるバッチ コードを "単体テスト" することもできます。

しかし、ほとんどの人は、「真の」「役立つ」単体テストには外部のものの存在は必要ないと考えています。このようなテストは、ビルド時に「ローカル」で実行できます。サーバー、ファイル システム、ネットワーキングなどは不要です。

それを念頭に置いて、あなたが取り組むことができる2つのことがあると思います:

  1. JUnit を使用して、「統合」または「機能テスト」を推進できます。つまり、「すべて」を行うテスト スイートを定義できます。つまり、バッチを定義し、バッチを処理して、最終的に期待される結果をチェックすることができます。前述のように、それはエンドツーエンドのフローが期待どおりに機能することを確認する統合テストになります。
  2. 「通常の」JUnit単体テストを調べます。意味: バッチ フレームワークとは「無関係」なコード内の側面に注目し (つまり、POJO に注意してください)、それらを単体テストします。ローカル; モックフレームワークを使用している可能性があります。コードを実行する実際のバッチ サービスに依存する必要はありません。
于 2016-09-15T04:26:35.780 に答える