ツイッターでJavaFXの同期がむずいとつぶやいていたら、@skrbさんから
@mike_neck ブログ書いたよ!! d.hatena.ne.jp/skrb/20120307
— Yuichi Sakurabaさん (@skrb) 3月 7, 2012
こんなツイートをいただきました。
JavaFXとJUnitのThreadについて丁寧に解説されていて、動作できたようです。
というわけで、コピペプログラマーとしてはコピペしないわけにはいきません。
早速Jettyも使ってunit testできるようにしましょう。
@BeforeClass
で起動するWebサービス
JUnitのテストコードの中でServerを持っているのが大分辛くなってきたので、
Serverのコードは外に出すことにしました。
まだ、試作段階なので、Handlerクラスなども固定でしか動きません。
一応、サーバーのアドレスとかポートも設定できるようにしておきたいので、
コンストラクターで指定できるようにはしてあります。
ただし、現段階では使っていません。
TestBrowser
JavaFXのWebEngineを使ってテストコードを走らせるクラスです。
@skrbさんのブログの内容をそのままコピーしています。
なお、一部分を変更しています。
どうやら
@Test
メソッドを実行時に、画面のロードが完了していないなどの同期の部分で失敗したため、javascript上でロードしたことをマークするようにして、ロードが完了するまでは待機するように
改造してあります。
なかなか、ソースが読みづらくてごめんなさい。試作段階ということで許しておくれ。
Threadの同期と非同期は難しいですね。
@skrbさんには非常に感謝しております。
実際のテストコード
実際のテストコードです。
これは単純に数値を計算する
function
を呼び出しているだけです。なお、
@Before
にてApplication#launch(Class<T extends Application>, java.lang.String[])
の第二引数でサーバーのURLを渡してあります。
これは、アプリケーション側で
getParameter()
メソッドを使うと取得することができます。サーバーのポートなどの問題でURLを変更することはよくあるので、
この辺は可変にしておきたかったです。
実行結果
実行結果は次のような感じになります。
お気づきな方もいると思いますが、
doStringTest
の方は@Ignore
しています。これ、
@Ignore
を外すと、2つ目のテストが今は動かない状態なんです。これは
TestBrowser
の部分の作りがまだまだ粗いため、2つ目のテストが実行できない状態になっているからですね。TestBrowser
の起動を@BeforeClass
に移動して、@Before
毎にページを読み直すような仕様に変更しようと考えています。とりあえず、今はこんな感じです。
どうやら…
@skrbさんの周囲で、
JRubyのなひさんとJenkinsの川口さんといった
錚々たる面々のお方から反応があったらしく、
意外と面白そうなプロダクトになりそうな気がしてきました。
Seleniumと比べて
SeleniumなどのUIテスト系と比べて、僕がこのFxJsJUnitでやりたかったのはjavascriptのunit testなので、
実はUIはあまり気にしていないんです。
なので、縦幅がいくつとかはあまり興味がなくて、
純粋にjavascriptの関数に対してTDDを実施していけるような状態にしたいというのが第一の目標です。
あと@skrbさんのブログにあったとおり、
GUIは別に表示しなくてもいいという点からいくと、
Seleniumのように画面がポコポコ生まれなくていいというのが強みかなと思っていたりします。
あとはwebkit搭載なので、巷に最近溢れているブラウザー(Chrome/Android用のブラウザ/Safari)に対応できるので、
モバイル系のアプリにも対応できるテストツールになりうるかもしれません。
いずれにせよ、もう少し安定して動かせるようにしたいところです。
なお、コードはgist( https://gist.github.com/2001562 )上にあげていますので、ぜひご意見等いただければ幸いです。
あと、そのうちちゃんとしたプロジェクトとしてgithubにプロジェクトを作りたいと思っています。
0 件のコメント:
コメントを投稿