Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Unit testing JavaScript with JUnit/JavaFX

7,823 views

Published on

Unit Testing Framework for JavaScript with Java

  • Be the first to comment

Unit testing JavaScript with JUnit/JavaFX

  1. 1. JUnitでJavaScriptテスト Fx-Js-JUnitの紹介
  2. 2. おことわり● この発表ではJavaFXの話は ほとんど出てきません。● JavaScriptの話を延々としま す。● あらかじめご了承下さい。
  3. 3. 誰?● 名前 : @mike_neck● 所属 : 無職 ○ 1日9時間勤務で18時定時で昼1時間の 休憩に加えて3時間昼寝できる会社探し ています。● 職業 : プログラマー ○ Groovy / JavaScript / Java● ブログ ○ mike、mikeなるままに…
  4. 4. 本日のテーマ● JavaでJavaScriptをテストす る ○ Fx-Js-JUnitの紹介 ○ 技術接近遭遇、的な ○ 名状しがたい…
  5. 5. ところで…
  6. 6. JavaScriptのテストどうしていますか?
  7. 7. QUnitjQueryのテストでも使われているシンプルかつ強力なテストフレームワーク。Phantom.jsでCUIから操作可能。JavaScriptでテストを記述。
  8. 8. Seleniumブラウザーの自動操作ツール。SeleniumWeb Driverを用いてUI系のテストが記述できる。画面がボコボコ立ち上がるのがうざい。
  9. 9. JavaでJavaScriptのテストが書けて、かつうざくない奴が欲しいと思いません?
  10. 10. そこでFx-Js-JUnitですよ!
  11. 11. Fx-Js-JUnitを三行で説明せよ!
  12. 12. Fx-Js-JUnitを三行で説明せよ!● JavaFX2.0のWebEngineを用いたテスト ツール。● JUnitで型安全にJavaScriptのテストが できる。● ブラウザーが立ち上がらないのでうざく ない!…ニャル子、あかちゃんつくろ
  13. 13. そうそう、JUnitの説明は省きますよ
  14. 14. 詳しくはWeb + DB プレス#69のJUnit特集で
  15. 15. Server JavaFXJUnit Test
  16. 16. サンプルテストコード@ClassRule @ClassRuleでテprivate static UseFxJsJUnit fxJsJUnit = スト前にJavaFX UseFxJsJUnit アプリケーション .address(http://www.google.com) を起動 .identifiedBy(TestClass).get();private JsJUnit jsJUnit;@Before JavaScriptのイpublic void setUp () { ンターフェースを jsJUnit = fxJsJUnit.getTester(); 取得}
  17. 17. サンプルテストコード 型Longを期 待するテスト@Test 実行public void longTest () { assertThat(jsJUnit.callLong(Integer.MAX_VALUE + " + 1"), is (Integer.MAX_VALUE + 1L));}@Test 型Personをpublic void personTest () { 期待するテス Person person = new Person(); ト実行 person.setName("mike"); person.setAge(35); assertThat(jsJUnit.callAs("{name : mike, age : 35}", Person.class), is (person));}
  18. 18. Fx-Js-JUnitJavaScriptのテストが
  19. 19. カターンゼン型安全
  20. 20. Fx-Js-JUnit< `・ω・´ > ヨロシク
  21. 21. The End
  22. 22.
  23. 23. ……
  24. 24. ………
  25. 25. すんません調子こきました
  26. 26. 技術
  27. 27. JavaScriptを型安全に取り扱うために● JavaFXスレッドの理解● 並列処理を構成する部材の 理解● JavaScriptオブジェクトから Javaオブジェクトへのマッピン グ
  28. 28. JavaFXスレッドの理解-1● アプリケーションを起動した後の部分のコードは アプリケーション終了後に実行される Application.launch(App.class); doSomething();↑Platform.exit(); の後に実行される。
  29. 29. JavaFXスレッドの理解-2● UIを構成するオブジェクトへの操作、結果の取 得はJavaFXスレッドを介する必要がある。 WebEngine engine; engine.executeScript("1 + 1"); Platform.runLater( { engine.executeScript("1 + 1");} );
  30. 30. JavaFXスレッドの理解-3● UIを構成するオブジェクトはJavaFXスレッド上で 生成しなければならない JavaFX Thread engine = new WebEngine(); WebEngine Main Thread WebEngine engine;
  31. 31. JavaFXスレッドの理解-まとめ● JUnitからWebViewを操作するために ○ JUnitとは別のスレッドからJavaFXアプリケー ションを起動 ○ 別のスレッドに演算させた結果を待機して、 取得 ○ JUnitはJavaFXスレッドでインスタンス化され たオブジェクトへの参照を取得
  32. 32. 並列処理を構成する部材の理解● java.util.concurrent.ExecutorService ○ 別スレッドの処理を簡易に記述 ○ JavaFXアプリケーションの起動にも ちいる● java.util.concurrent.BlockingQueue<T> ○ JavaFXスレッドからのメッセージング (値のやり取り)に使用する● javafx.application.Platform ○ JavaFXへの操作を提供
  33. 33. 並列処理を構成する部材の理解詳しい話は下記の書籍を参照。Java並行処理プログラミング3,990JPYくらい。http://goo.gl/UUzc1
  34. 34. JS→JavaマッピングWebEngineのAPIよりhttp://docs.oracle.com/javafx/2/api/javafx/scene/web/WebEngine.html JavaScript values are represented using the obvious Java classes: null becomes Java null; a boolean becomes a java.lang.Boolean; and a string becomes a java.lang.String. A number can be java.lang.Double or a java.lang.Integer, depending...If the result is a JavaScript object, it is wrapped as an instance of the netscape. javascript.JSObject
  35. 35. JS→Javaマッピング JavaScript typeof Java Object Object value null object null false boolean java.lang.Boolean 23 number java.lang.Integer 1.10 number java.lang.Double "script" string java.lang.String
  36. 36. JS→JavaマッピングWebEngineのAPIよりhttp://docs.oracle.com/javafx/2/api/javafx/scene/web/WebEngine.html JavaScript values are represented using the obvious Java classes: null becomes Java null; a boolean becomes a java.lang.Boolean; and a string becomes a java.lang.String. A number can be java.lang.Double or a java.lang.Integer, depending...If the result is a JavaScript object, it is wrapped as an instance of the netscape. javascript.JSObject
  37. 37. JS→Javaマッピング ┌(┌ ^o^)┐ JSObject...
  38. 38. JS→JavaマッピングPlain Old JavaScript Object (POJSO)ならJSObject#getMember()でマッピングが可能{name : "cthuga", str : 80, con : 120, siz :140, pow : 42}JSObject cthuga = ...;assertThat( (String)cthuga.getMember("name"), is ("cthuga") );
  39. 39. JS→JavaマッピングSAN値を減少させるオブジェクト…
  40. 40. JS→JavaマッピングDateオブジェクト…JSObject date = ...;date.getMember("year"); JSExceptionが発生する
  41. 41. JS→JavaオブジェクトJavaScriptのDateオブジェクトにはメソッドはあるが、メンバーは存在しない。 ←Dateオブジェクトに はメンバーがない ←POJSO
  42. 42. JS→JavaマッピングちなみにJavaScriptでちゃんとメンバーの隠蔽化がなされたオブジェクト…var Encapsulation = function() { var count = 0; this.addAndGet = function () { count ++; return count; }};var counter = new Encapsulation();return counter;
  43. 43. JS→Javaマッピングそういったオブジェクトもメンバーを持ちません。
  44. 44. JS→JavaマッピングメンバーのないJSObjectをPOJOにマッピングするいい方法はないか
  45. 45. JS→Javaマッピングメソッドと戻り値の型情報がわかれば大丈夫だ、問題ない
  46. 46. JS→Javaマッピングテストしたい関数
  47. 47. JS→Javaマッピング関数を実行する関数を作成
  48. 48. JS→Javaマッピング関数を実行する関数を実行
  49. 49. JS→Javaマッピング関数を実行する関数を実行する関数を作る
  50. 50. JS→Javaマッピング{…}を無名関数化
  51. 51. JS→Javaマッピング戻り値を既知のメソッドでPOJSO化
  52. 52. JS→Javaマッピングテスト実行
  53. 53. JS→Javaマッピング既知の型、メンバーを持つPOJSOを取得(int) jsObject.getMember("addAndGet");
  54. 54. JS→JavaマッピングDateはPOJSOにマッピング
  55. 55. JS→Javaマッピング既知の型とメソッドはアノテーションに記述
  56. 56. JS→Javaマッピング型安全に実行してassertionできる!
  57. 57. JS→Javaマッピングequals(java.lang.Object)とhashCode()メソッドの実装は自己責任でね★
  58. 58. JS→Javaマッピング● プリミティブ型は直接取得してassert● POJSOはgetMemberメソッド経由で POJOにマッピングしてassert● 特殊なオブジェクトはアノテーションのメ タ情報からPOJSOを経由してマッピング してassert
  59. 59. Fx-Js-JUnitJavaScriptのテストが
  60. 60. カターンゼン型安全
  61. 61. Enjoy JavaScript!
  62. 62. ご静聴ありがとぉ…
  63. 63. …ぉ?
  64. 64. テストは複数同時に実行 したいですよねぇ
  65. 65. お望みであればやってみせますが…
  66. 66. 名状しがたい…SAN値が下がりますよdef service = Executors.newThreadPool(2)service.execute { Application.launch(App) }service.execute { Application.launch(App) }
  67. 67. 名状しがたい…
  68. 68. 名状しがたい…
  69. 69. 名状しがたい…複数 + JavaFX で検索
  70. 70. 名状しがたい…
  71. 71. 名状しがたい…JavaFXは二度起動させることはできぬ!
  72. 72. 名状しがたい…● 複数のテストへの対応 ○ WebEngineを複数立ち上げる ○ 定期的にポーリングを行なって、 WebEngineが利用されなくなったら 終了する
  73. 73. 名状しがたい…● TODOs ○ 複数のテストへの対応 ○ ServletコンテナまたはJavaEEコン テナの搭載 ○ GitHubへの公開 ○ Maven/Ivyレポジトリーへの登録 ○ 他ご要望がありましたら @mike_neckまで
  74. 74. Thank youfor your attention

×