Kohei Nozaki's blog 

Arquillianでジョブのテストをしてみる


Posted on Monday Feb 10, 2014 at 06:54PM in Technology


CLIからリモートEJB経由でジョブを操作してみる のところで使ってみたリモートEJB呼び出しとArquillianを使って、ジョブのJUnitテストを書いてみる。ついでにテーブルのデータ検証とかもしてみる

バッチ開発時の雛型プロジェクト的に使えるように若干作り込んでみる

環境

  • WildFly8.0.0.CR1
  • wildfly-arquillian-container-remote 8.0.0.CR1
  • Arquillian Persistence Extension 1.0.0.Alpha6
  • Arquillian 1.1.2Final
  • Eclipse Kepler SR1
  • Oracle JDK7u51
  • postgresql-9.3-1100.jdbc41.jar
  • PostgreSQL 9.2.6

前提条件

  • CLIからリモートEJB経由でジョブを操作してみる で作った資源とかが普通に動いているものとする
  • データソースとかJDBCドライバとかも適当にAPサーバ側に定義されて使えるようになっているものとする。ここではArquillian側で定義したデータソースのデプロイとかはやらない。WildFlyでのデータソース定義はこのへんが参考になるかも

準備

資源の配置図

プロジェクト内の資源はこんな感じ。前に作ったjbatchifプロジェクトへの依存が有る。資源の詳細はGitHubのここのjbatchtestプロジェクト参照

MyJobOperatorImpl.java

CLIからリモートEJB経由でジョブを操作してみる で作ったのと同じもの。テストクラスからこのクラスのメソッドがリモートEJBで呼び出され、ジョブの起動やBatchStatusの取得が行われる

FugeEntity.java

IDとfugeっていうフィールドだけの簡単なエンティティ

test.xml

ジョブXML。Stepは1つだけ。fugeUpdateBatchletが走るだけ

FugeUpdateBatchlet.java

FugeEntityをEntityManager#find()で1つ取ってきてfugeフィールドを書き換える超単純なBatchlet

AbstractJobTest.java

テストクラスの親クラス。だいたい以下のような内容が書いてある

  • @Deploymentアノテーション付きメソッド。たぶん他のジョブ用のテスト書くときも共通なのでここに置く
  • @ResourceアノテーションでリモートEJB経由のJobOperatorの参照を注入させる。JNDI名もここに書かれている
  • ジョブの実行が終わるまで1秒間隔でJobExecutionをポーリングするstartJob()メソッドを持つ。テストクラスはこのメソッドを使ってジョブを起動する

TestJobTest.java

テストクラス。Arquillian Persistence Extensionの機能を使う。以下をやる

  • テスト実行前のDBへのデータ投入。ファイル名もここに書いてある
  • テスト実行後のDB上のデータ検証。ファイル名もここに書いてある
  • BatchStatusの検証

arquillian.xml

設定内容は以下

  • Arquillian Persistence Extension用のデータソースの指定
  • DBのクリーンアップはテスト実行前にやらせる

fugeentity.yml

テスト実行前に投入するデータ

expected.yml

テスト実行後の検証用データ

実行してみる

手順

  1. APサーバを起動する
  2. jbatchtestプロジェクトをデプロイ
  3. TestJobTestを普通にJUnitテストとして実行

テスト結果は普通に緑色になる

APサーバのログ

まあ普通。デプロイする物が少ないせいか割と早い。

16:49:07,091 INFO  [org.jboss.as.repository] (management-handler-thread - 223) JBAS014900: Content added at location /Users/kyle/apps/wildfly-8.0.0.CR1/standalone/data/content/1d/b651139b3cf98767bf2bdb8e1cedbfaff7497c/content
16:49:07,092 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-4) JBAS015876: Starting deployment of "test.war" (runtime-name: "test.war")
16:49:07,120 WARN  [org.jboss.as.dependency.private] (MSC service thread 1-1) JBAS018567: Deployment "deployment.test.war" is using a private module ("org.wildfly.security.manager:main") which may be changed or removed in future versions without notice.
16:49:07,120 INFO  [org.jboss.weld.deployer] (MSC service thread 1-5) JBAS016002: Processing weld deployment test.war
16:49:07,126 INFO  [org.jboss.weld.deployer] (MSC service thread 1-7) JBAS016005: Starting Services for CDI deployment: test.war
16:49:07,127 INFO  [org.jboss.as.arquillian] (MSC service thread 1-7) Arquillian deployment detected: ArquillianConfig[service=jboss.arquillian.config."test.war",unit=test.war,tests=[job.test.TestJobTest]]
16:49:07,127 INFO  [org.jboss.weld.deployer] (MSC service thread 1-1) JBAS016008: Starting weld service for deployment test.war
16:49:07,184 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-16) JBAS017534: Register web context: /test
16:49:07,191 INFO  [org.jboss.as.server] (management-handler-thread - 223) JBAS018559: Deployed "test.war" (runtime-name : "test.war")
16:49:08,638 WARN  [org.dbunit.dataset.AbstractTableMetaData] (pool-2-thread-28) Potential problem found: The configured data type factory 'class org.dbunit.dataset.datatype.DefaultDataTypeFactory' might cause problems with the current database 'PostgreSQL' (e.g. some datatypes may not be supported properly). In rare cases you might see this message because the list of supported database products is incomplete (list=[derby]). If so please request a java-class update via the forums.If you are using your own IDataTypeFactory extending DefaultDataTypeFactory, ensure that you override getValidDbProducts() to specify the supported database products.
16:49:08,651 DEBUG [org.hibernate.SQL] (batch-batch - 5) select fugeentity0_.id as id1_0_0_, fugeentity0_.fuge as fuge2_0_0_ from FugeEntity fugeentity0_ where fugeentity0_.id=?
16:49:08,653 DEBUG [org.hibernate.SQL] (batch-batch - 5) update FugeEntity set fuge=? where id=?
16:49:09,660 WARN  [org.dbunit.dataset.AbstractTableMetaData] (pool-2-thread-28) Potential problem found: The configured data type factory 'class org.dbunit.dataset.datatype.DefaultDataTypeFactory' might cause problems with the current database 'PostgreSQL' (e.g. some datatypes may not be supported properly). In rare cases you might see this message because the list of supported database products is incomplete (list=[derby]). If so please request a java-class update via the forums.If you are using your own IDataTypeFactory extending DefaultDataTypeFactory, ensure that you override getValidDbProducts() to specify the supported database products.
16:49:09,689 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-16) JBAS017535: Unregister web context: /test
16:49:09,690 INFO  [org.jboss.weld.deployer] (MSC service thread 1-7) JBAS016009: Stopping weld service for deployment test.war
16:49:09,696 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-9) JBAS015877: Stopped deployment test.war (runtime-name: test.war) in 7ms
16:49:09,703 INFO  [org.jboss.as.repository] (management-handler-thread - 223) JBAS014901: Content removed from location /Users/kyle/apps/wildfly-8.0.0.CR1/standalone/data/content/1d/b651139b3cf98767bf2bdb8e1cedbfaff7497c/content
16:49:09,703 INFO  [org.jboss.as.server] (management-handler-thread - 223) JBAS018558: Undeployed "test.war" (runtime-name: "test.war")

テーブル

まあ普通。

jbatcharts=# select * from fugeentity order by id;
 id |     fuge     
----+--------------
  1 | FugeModified
  2 | FugeFuge
(2 rows)

備考

何か無駄に複雑にしているような気がするが何か他に良いテストの方法ないだろうか。



No one has commented yet.

Leave a Comment

HTML Syntax: NOT allowed