bon now

ありのままの現実を書き殴る吐き溜め。底辺SEの備忘録。
Written by bon who just a foolish IT Engineer.

続 JBoss seamでtestNGのSeamTest

Created Date: 2013/07/22 22:35
Updated Date: 2023/07/03 19:46

引き続きJBoss Seamのお話。
あれから休みを挟むこと約1週間。ようやくテスト対象のメソッドが動き出した。

Seamコンポーネントを使ったテストというのは、テストクラスに extends SeamTest というクラスの継承が必要となる。
これがあるおかげで、@Inや@OutなどのSeamによるアノテーションを、テストクラスと共有することが出来るようになる。

まあ、ここまではいいんだけど、これにも色々と制約があった。
とりあえず自分が調べたことを以下にがっつり記載しようと思う。
誰かの役に立つと信じて。。。

(環境は JBoss Seam 2.2.0 GA、JBossAS 5.1)

  1. いらないファイルがtestディレクトリに存在していないか
    (seam-genで生成されるantのbuild.xmlを参照)

  2. 余計なライブラリがクラスパスに存在しないか
    特に2つにプロジェクトを分けている場合、
    jboss-seam.jarが2つあり、それがEJBのエラーに繋がっていた気がする
    この場合、面倒だがテストケース独自にクラスパスを構成させてやる

  3. bootstrapに<プロジェクト名>-ds.xmlがあるか
    bootstrapのdeployディレクトリに、上記ファイルが必要。
    さらに、を使ってはいけない。

  4. persistence.xmlの設定
    persistence-unitには transaction-type="JTA" を指定し、
    jta-data-sourceは java:/<データソース名> とする。

  5. jboss-embeded-api.jarがあるか
    これをクラスパスに入れておかないと、Face云々.run()の実行時に
    [provider_url not probided in jindi.properties]というエラーが発生する。

  6. テスト対象クラスでの変数の宣言
    変数名がSeamコンポーネントの@nameと同一でないと、SeamTestのsetValue()では、
    インジェクション・アウトジェクションしてくれない。
    (Seamコンポーネントとして認識してくれない?)
    特に private 指定があると尚更だめである。
    この場合、setFieldを使ってリフレクションを利用した値の導入が必要となる。
    これについては、洋書ながら以下の書籍が参考になる。
    http://www.amazon.co.jp/Seam-Framework-Experience-Evolution-Series/dp/0137129394

いかがだろうか。
SeamTestを用いたTestNGによるテスト自動化は、日本語文献もWeb検索でいくつか出てくるけど、
その多くはSeam1の時代だったりちょっと古い情報だったりする(まあ、Seam2.2やJBossAS5も十分いまや古いけど) 。
また、実際のテストケースの書き方などに至っては、RedHatの公開するドキュメントかサンプルソースくらいしか参考にできない。

そんな中でも、先駆者的にTestNGによるテスト自動化を行ってきた先人達は偉大である。

なお、挙げたもの以外にも例えばソース内でJSFから直接値を持ってきている箇所がある場合
(FacesContext.getCurrentInstance().云々…)、またさらにややこしくなるのだが、
これは出来上がったらgistなりGithubなりにアップロードしようかなと思っている。
とはいえSeam 2.2.0GAの場合、\src\test\unit\org\jboss\seam\test\unit に有用なサンプルが転がっているので、これを見れば大抵の単体テストは可能になると思われる。

さて、次はいよいよJenkinsとの連携だ。  

野望実現の道のりは遠い。

local_offer
folder work