エミュレーションモードによるアプリケーションテスト

この文書では、エミュレーションモードを利用したアプリケーションのテストについて説明します。

エミュレーションモード

エミュレーションモードを有効にしてAsakusa DSLのテストを実行すると、Asakusa Frameworkが提供するラッパー機構を利用してHadoopの処理を実行します。

エミュレーションモードではテストを実行しているプロセス内でほとんどの処理を行うため、デバッグモードのブレークポイントなどを利用できるようになります。

Attention

本機能はアプリケーションプロジェクトのHadoopライブラリを利用するため、標準で設定されたものと異なるHadoopディストリビューションやバージョンを利用する際に、正しく動かない可能性があります。

Hint

エミュレーションモードを有効にしていない場合、テスト実行時にコマンドラインインターフェースを利用して、別プロセスで様々な処理を行います。

別プロセスで動作させたほうが Java VM 上の問題は起こりにくくなるため、エミュレーションモード利用時に正しく動かない場合には、本機能を無効化して動作を確認してみることを推奨します。

Hint

エミュレーションモードを使用することで、Windows環境でテストドライバーを使ったテストの実行が可能となります。

Windows環境でエミュレーションモードを使った開発環境の設定例については、 Asakusa Framework スタートガイド for Windows を参照してください。

フローDSL/バッチDSLのテスト

エミュレーションモードを有効にして データフローのテスト を行うと、IDEからブレークポイントを指定してデータフロー内の演算子メソッドの動作を確認したり、カバレッジツールと連携して演算子メソッドのテストカバレッジを確認しやすくなります。

インテグレーションテスト

バッチテストランナー とエミュレーションモードを併用すると、インテグレーションテスト時のデバッグ作業がやりやすくなります。

エミュレーションモードの利用方法

Asakusa Framework バージョン 0.8.0 以降では、Asakusa Framework スタートガイドAsakusa Gradle Plugin ユーザーガイド などで説明しているプロジェクトテンプレートを利用する場合、 標準でエミュレーションモードが利用されます。

エミュレーションモードの設定

アプリケーションプロジェクトでエミュレーションモードの設定を変更する場合は、ビルドスクリプトの asakusafw ブロック内の sdk.testkit の値を変更します。

以下は、エミュレーションモードを利用を明示的に設定する例です。この設定は Asakusa Gradle Plugin ユーザーガイド を利用する標準の構成と同じ設定です。

build.gradle
asakusafw {
    sdk.testkit 'mapreduce-emulation'
}

エミュレーションモードの設定を無効化し、環境のHadoopを利用するには以下のように設定します。

build.gradle
asakusafw {
    sdk.testkit 'mapreduce'
}

Attention

通常はエミュレーションモードの利用を推奨しています。 エミュレーションモードが正常に動作しないなどの場合にのみ、この設定変更を検討してください。

Tip

エミュレーションモードを有効する別の方法として、ビルドスクリプトにはモジュール設定を記述せず、 Shafu の機能を使ってEclipse上で設定する方法があります。 この方法で設定を行うと、Eclipse上でのみエミュレーションモードが有効になります。 詳しくは Shafu の「設定」の説明を参照してください。

Gradle上でのテストドライバー実行

エミュレーションモードの設定 を有効化した状態でGradleの test タスクを実行すると、テストドライバーがエミュレーションモードで実行されます。

Tip

エミュレーションモードを有効にして Gradle上でテストを実行すると、Gradleが提供する JaCoCo Plugin などのソースコードカバレッジ取得機能との連携が可能になります。

Attention

Asakusa Framework バージョン 0.10.4 において、Windows上でエミュレーションモードを有効してテストドライバーを実行した際に以下のようなエラーログが出力されることがありますが、動作上は問題ありません。

INFO  インプロセステスト実行用の機能をテストドライバーにインストールしています
INFO  インプロセステスト実行用の最適化設定をテストドライバーにインストールしています
ERROR Failed to locate the winutils binary in the hadoop binary path
java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
    at org.apache.hadoop.util.Shell.getQualifiedBinPath(Shell.java:356) [hadoop-common-2.7.2.jar:na]
    ...

Eclipse上でのテストドライバー実行

エミュレーションモードの設定 を有効化した状態でGradleの eclipse タスクを実行すると、Eclipse上でアプリケーションプロジェクトに対してエミュレーションモードが有効になります。

この状態でEclipseからテストドライバーを利用するテストクラスやバッチテストランナーを実行すると、テストドライバーがエミュレーションモードで実行されます。

Tip

エミュレーションモードを有効にすると、テストドライバーを使ったテストクラスのデバッグ実行時にEclipseのブレークポイント機能などを利用できます。

実行モードの選択

Attention

通常の場合、ここで説明する設定は不要です。 旧バージョンからのマイグレーション後にエミュレーションモードが正常に動作しない場合にのみ、ここで説明する設定を有効にして動作を確認してください。

標準の設定では、 com.asakusafw.sdk:asakusa-sdk-test-emulation を指定したエミュレーションモードの実行時にはスモールジョブ実行エンジンが使用されます。

エミュレーションモードをスモールジョブ実行エンジンを使用しない設定で実行するには、テストドライバー実行時に以下のシステムプロパティを設定します。

asakusa.testdriver.configurator.inprocess.optimize
  • true: エミュレーションモードでスモールジョブ実行エンジンを使用する(デフォルト)
  • false: エミュレーションモードでスモールジョブ実行エンジンを使用しない

Attention

Asakusa Framework バージョン 0.7.2 以前では com.asakusafw:asakusa-test-inprocess を指定したエミュレーションモードの実行にはスモールジョブ実行エンジンは使用されませんでしたが、バージョン 0.7.3 からはスモールジョブ実行エンジンを使用するよう変更されました。

See also

スモールジョブ実行エンジンについては、 MapReduceタスクの最適化設定 を参照してください。