Apache Hadoopのユニットテストを回す


ユニットテストを回すオプションについてまとめました。開発者向けです。

普通に回す

$ mvn test -Pnative -Pshelltest
  • -Pnative: ネイティブライブラリをビルドし、それが必要なテストを実行する
  • -Pshelltest: シェルスクリプトのテストを実行する

このコマンドを実行すると全てのmoduleでテストしてくれるのですが、テストが失敗したmoduleで止まってしまい、全てのmoduleでテストを回すことができません。Apache Hadoopでは時々失敗するテストがいくつかあり、それが完全には修正されていないため、大抵はhadoop-hdfs moduleで落ちてしまい、それ以降のテストは実行されないということになります。各moduleのルートディレクトリに移動してテストをすればいいのですが、module自体が大量にあるので若干面倒です。

全moduleでテストを回す

全moduleでテストを回すには、qbt(quality build tool)というツールを使うのが楽だと思います。Apache Yetusというプロジェクトで開発されており、Apache Hadoopコミュニティのdaily buildにも含まれています。

以下のコマンドを実行すると、ローカルでテストを回すことができます。

$ dev-support/bin/qbt <path to the patch> --run-tests

コア数に余裕がある場合は、--test-parallel=trueオプションをつけるとよいでしょう。

dev-support/bin/qbt
BINDIR=$(cd -P -- "$(dirname -- "${BASH_SOURCE-0}")" >/dev/null && pwd -P)
exec "${BINDIR}/yetus-wrapper" qbt --project=hadoop --skip-dir=dev-support "$@"

Apache Hadoopのdev-support/bin/qbtの実体はたったこれだけです。内部では、yetus-wrapperがApache Yetusをダウンロードして、そこに入っているqbtを実行します。

checkstyleなども一緒に回ってくれるので、開発者としては非常に便利です。試しに手元で動かしてみたときの実行ログをgistに貼っておきました。

全てのmoduleのテストを回す必要性について

Apache HadoopのJenkins precommit job(パッチを投稿したら自動的に回るジョブ)では、投稿されたパッチによって変更されたmoduleに含まれるテストのみ実行します。通常の場合これは非常に有用で、不要なテストをスキップすることで、ジョブの時間短縮に非常に役立っています。ただし、あるmoduleの変更が他のmoduleに影響する場合、実行してほしかったテストが実行されない、という問題に引っかかります。例えば、HADOOP-13514でmaven-surefire-pluginのバージョンを上げたのですが、それが原因で大量のユニットテストが失敗するようになってしまいました。他にも、YARNの変更によってMapReduceのユニットテストが失敗する、といったことはよく見かけられます。このように、他のmoduleにも影響しそうなパッチをコミットする前には、あらかじめ全てのテストを実行しておくことが必要です。

(注意)ここから先の内容について

ここから先のオプションは、私が実際に試したことがないので、説明も少なめです。

もっと高速にテストを回す

dist_testを使いましょう。

GCEやEC2インスタンスを大量に立ち上げて、一気にテストを回すツールです。Apache Hadoopのテストは全部で1700以上あって、全てを回すのに8時間以上かかります。8コアで並列処理しても単純計算で1時間以上かかるのですが、このツールを使うと10分以内で終わらせることができます。

S3クライアントのテストを回す

当然ですが、S3を利用するテストはデフォルトでは実行されません。設定方法は以下のドキュメントに書いてあるので読んでください。(丸投げ)

Azure StorageやOpenStack Swiftのクライアントのテストについても同様です。