コンテナでテストをまわせ!          Java EE への自動テストの導入    小西 高之    JBoss Technical Support Engineer1   Red Hat K.K.
コンテナでテストをまわせ!    Twitter ハッシュタグ: #jt12_b202    小西 高之    @leather_sole2
とあるプロジェクトで ...『これからアプリケーションのテストを始める』『はい!』『まずはこのテストだ!』3
!?4
『そんなの意味がないですよ!』5
『そうさ、意味なんかない』6
『俺たちは、7
『俺たちは、こんなテストを ...8
強いられているんだ!』9
とお考えの皆さんのためのセッションです10
今日話すこと     ●         自動テストの考え方     ●         テストフレームワークのご紹介     ●         デモ     ●         実際のプロジェクトへの適用     ●         まとめ11
Java EE 6 Architecture     Applet Container     Applet Container         Web Container                              Web Co...
自動テスト     ●         メリット         ●             リグレッションテスト         ●             再現可能         ●             実行時に人手が不要     ●...
各テスト自動化の              容易 / 簡単難易度と効果                テストの作成・メンテナンス・                      実行前処理・実行・結果確認・                     ...
容易 / 簡単                        優先的に                        テストを作成     小   効果                大     自動化以外の     方法を考える15     ...
テストの分類     ● Unit Test     ● Integration Test     ● System Test16
Unit Test     ●         個々のクラスのテスト     ●         JVM 内で閉じている     ●         実行速度が速い     ●         Java EE 5 以降、容易にテストできるように...
Integration Test     ●         コンポーネントのテスト         ●             例)秘密鍵ファイルを使って XML に署名する     ●         コンテナ、ネットワーク、 DB 、ファ...
System Test     ●         フィーチャーのテスト         ●             例)ユーザーとしてシステムにユーザー情報を登録する     ●         コンテナ、ネットワーク、 DB 、ファイルなど...
容易 / 簡単Unit Test     小   効果             大20              困難 / 複雑
容易 / 簡単Integration Test     小   効果                  大21                   困難 / 複雑
容易 / 簡単System Test     小   効果             大22              困難 / 複雑
Integration Test の問題点     ●         テスト作成が大変     ●         実行に時間がかかる     ●         テストコードが脆い         効果は期待できるが、テスト作成、維持にコス...
容易 / 簡単Integration Test     小   効果                  大24                   困難 / 複雑
容易 / 簡単After     小   効果             大25              困難 / 複雑
26
Integration Test を自動化する力が欲しいか ... ?27
Integration Test を自動化する力が欲しいか ... ?28
29
Integration Test     Framework のご紹介         http://arquillian.org/30
https://github.com/arquillian31
Arquillian の特徴     ●         複数のコンテナに対応                   Web Container     EJB Container                                 ...
Arquillian の特徴     ●         JUnit/TestNG のテストケースとしてテストを作成     ●         ビルドツール非依存     ●         IDE の自動ビルド機能と連携     ●    ...
Arquillian 利用プロジェクトの例     ●         Seam 3         ●             http://seamframework.org/Seam3     ●         Apache Delta...
例     CDI Bean のテスト35
Greeter.java       /**        * A component for creating personal greetings.        */       public class Greeter {       ...
GreeterTest.java      @RunWith(Arquillian.class)      public class GreeterTest {          @Deployment          public stat...
GreeterTest.java                                              Arquillian を指定      @RunWith(Arquillian.class)      public c...
GreeterTest.java      @RunWith(Arquillian.class)      public class GreeterTest {          @Deployment          public stat...
GreeterTest.java      @RunWith(Arquillian.class)      public class GreeterTest {          @Deployment                     ...
GreeterTest.java      @RunWith(Arquillian.class)      public class GreeterTest {          @Deployment          public stat...
ファイル構成42
●     デモの実行環境     ●         Weld 1.1.1.Final         ●             embedded     ●         GlassFish 3.1         ●         ...
Container management     ●         Embedded     ●         Remote     ●         Managed44
Managed mode     JUnit45
Managed mode     JU   Arquillian class          (extends          BlockJUnit4ClassRunner)46
Managed mode     boot     arquillian service     JAR file47
Managed mode     run tests48
Managed mode     correct result       undeploy       shutdown49
Managed mode     JU          result50
DEMO51
ふりかえり     ●         テスト実行速度について         ●             IDE の自動ビルドを利用         ●             最新コンテナ:起動が高速52
実プロジェクトへの適用     ●         既存のコードへの適用     ●         DB 、ネットワーク     ●         画面遷移53
実プロジェクトへの適用     ●         既存のコードへの適用     ●         DB 、ネットワーク     ●         画面遷移     ●         arquillian-showcase を参照してくだ...
実プロジェクトへの適用     ●         既存のコードへの適用     ●         DB 、ネットワーク     ●         画面遷移55
『新規プロジェクトの例なんて、意味がない』56
『俺たちは、既存コードのメンテナンスを ...57
強いられているんだ!』58
とお考えの皆さんのためのデモです59
既存コードへの            容易 / 簡単自動テストの適用                     優先的に                             テストを作成     小   効果                 ...
DEMO     ●         既存コードの例: OpenAM     ●         WAR ファイルを読み込んで、テストアーカイブを作成     ●         テストを実行         ●             コンテ...
DEMO62     JU
まとめ63
これまでの Integration Test     ●         テスト作成が大変     ●         実行に時間がかかる     ●         テストコードが脆い         効果は期待できるが、テスト作成、維持にコ...
Arquillian を利用した Integration Test     ●         作成、管理、実行が容易     ●         実行が高速     ●         テストコードが脆くない65
容易 / 簡単Integration Test     小   効果                  大66                   困難 / 複雑
コンテナでテストをまわせ!         Java EE への自動テストの導入     ご清聴ありがとうございました67
References     ●         Arquillian - JBoss Community                               ●                                     ...
Upcoming SlideShare
Loading in …5
×

Javaone2012 BoF2-02 コンテナでテストをまわせ!Java EEへの自動テストの導入

3,889 views
3,781 views

Published on

JavaOne Tokyo 2012 のセッション:コンテナでテストをまわせ!Java EEへの自動テストの導入 のスライドです。

Published in: Technology
1 Comment
10 Likes
Statistics
Notes
No Downloads
Views
Total views
3,889
On SlideShare
0
From Embeds
0
Number of Embeds
1,015
Actions
Shares
0
Downloads
0
Comments
1
Likes
10
Embeds 0
No embeds

No notes for slide

Javaone2012 BoF2-02 コンテナでテストをまわせ!Java EEへの自動テストの導入

  1. 1. コンテナでテストをまわせ! Java EE への自動テストの導入 小西 高之 JBoss Technical Support Engineer1 Red Hat K.K.
  2. 2. コンテナでテストをまわせ! Twitter ハッシュタグ: #jt12_b202 小西 高之 @leather_sole2
  3. 3. とあるプロジェクトで ...『これからアプリケーションのテストを始める』『はい!』『まずはこのテストだ!』3
  4. 4. !?4
  5. 5. 『そんなの意味がないですよ!』5
  6. 6. 『そうさ、意味なんかない』6
  7. 7. 『俺たちは、7
  8. 8. 『俺たちは、こんなテストを ...8
  9. 9. 強いられているんだ!』9
  10. 10. とお考えの皆さんのためのセッションです10
  11. 11. 今日話すこと ● 自動テストの考え方 ● テストフレームワークのご紹介 ● デモ ● 実際のプロジェクトへの適用 ● まとめ11
  12. 12. Java EE 6 Architecture Applet Container Applet Container Web Container Web Container EJB Container EJB Container Client Client JSP JSP Servlet Servlet EJB EJB JSF, CDI, JPA, JSF, CDI, JPA, CDI, JPA, JMS, CDI, JPA, JMS, JMS, JAX-RS, JMS, JAX-RS, JAX-RS, JACC, JAX-RS, JACC, JACC, JTA, ... JACC, JTA, ... JTA, ... JTA, ... Application  Application  Client Container Client Container Client Client CDI, JPA, JMS, CDI, JPA, JMS, ... ... Database Database12
  13. 13. 自動テスト ● メリット ● リグレッションテスト ● 再現可能 ● 実行時に人手が不要 ● デメリット ● テスト作成 ● メンテナンス13
  14. 14. 各テスト自動化の 容易 / 簡単難易度と効果 テストの作成・メンテナンス・ 実行前処理・実行・結果確認・ 事後処理の難易度 小 効果 大 テストの明確さ、テスト対象の 変更可能性などによる自動化の 効果14 困難 / 複雑
  15. 15. 容易 / 簡単 優先的に テストを作成 小 効果 大 自動化以外の 方法を考える15 困難 / 複雑
  16. 16. テストの分類 ● Unit Test ● Integration Test ● System Test16
  17. 17. Unit Test ● 個々のクラスのテスト ● JVM 内で閉じている ● 実行速度が速い ● Java EE 5 以降、容易にテストできるようになった ● コンテナの機能を補うためのオブジェクトが必要17
  18. 18. Integration Test ● コンポーネントのテスト ● 例)秘密鍵ファイルを使って XML に署名する ● コンテナ、ネットワーク、 DB 、ファイルなどを使用18
  19. 19. System Test ● フィーチャーのテスト ● 例)ユーザーとしてシステムにユーザー情報を登録する ● コンテナ、ネットワーク、 DB 、ファイルなどを使用19
  20. 20. 容易 / 簡単Unit Test 小 効果 大20 困難 / 複雑
  21. 21. 容易 / 簡単Integration Test 小 効果 大21 困難 / 複雑
  22. 22. 容易 / 簡単System Test 小 効果 大22 困難 / 複雑
  23. 23. Integration Test の問題点 ● テスト作成が大変 ● 実行に時間がかかる ● テストコードが脆い 効果は期待できるが、テスト作成、維持にコスト がかかる23
  24. 24. 容易 / 簡単Integration Test 小 効果 大24 困難 / 複雑
  25. 25. 容易 / 簡単After 小 効果 大25 困難 / 複雑
  26. 26. 26
  27. 27. Integration Test を自動化する力が欲しいか ... ?27
  28. 28. Integration Test を自動化する力が欲しいか ... ?28
  29. 29. 29
  30. 30. Integration Test Framework のご紹介 http://arquillian.org/30
  31. 31. https://github.com/arquillian31
  32. 32. Arquillian の特徴 ● 複数のコンテナに対応 Web Container EJB Container Web Container EJB Container ● Java EE Containers JSP JSP Servlet Servlet EJB EJB ● Web Containers JSF, CDI, JPA, JSF, CDI, JPA, CDI, JPA, JMS, CDI, JPA, JMS, ● EJB Containers JMS, JAX-RS, JMS, JAX-RS, JAX-RS, JACC, JAX-RS, JACC, ● CDI Containers JACC, JTA, ... JACC, JTA, ... JTA, ... JTA, ... https://docs.jboss.org/author/display/ARQ/Supported+containers32
  33. 33. Arquillian の特徴 ● JUnit/TestNG のテストケースとしてテストを作成 ● ビルドツール非依存 ● IDE の自動ビルド機能と連携 ● 拡張可能 ● ( 開発中 ) Selenium, DBUnit, Andloid ...33
  34. 34. Arquillian 利用プロジェクトの例 ● Seam 3 ● http://seamframework.org/Seam3 ● Apache DeltaSpike ● https://cwiki.apache.org/DeltaSpike/ ● JBoss AS 7 ● http://www.jboss.org/as7 ● JBoss RHQ ● http://www.jboss.org/rhq34
  35. 35. 例 CDI Bean のテスト35
  36. 36. Greeter.java /** * A component for creating personal greetings. */ public class Greeter { public void greet(PrintStream to, String name) { to.println(createGreeting(name)); } public String createGreeting(String name) { return "Hello, " + name + "!"; } }36
  37. 37. GreeterTest.java @RunWith(Arquillian.class) public class GreeterTest { @Deployment public static JavaArchive createDeployment() { return ShrinkWrap.create(JavaArchive.class) .addClass(Greeter.class) .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); } @Inject Greeter greeter; @Test public void should_create_greeting() { Assert.assertEquals("Hello, Earthling!", greeter.createGreeting("Earthling")); greeter.greet(System.out, "Earthling"); } }37
  38. 38. GreeterTest.java Arquillian を指定 @RunWith(Arquillian.class) public class GreeterTest { @Deployment public static JavaArchive createDeployment() { return ShrinkWrap.create(JavaArchive.class) .addClass(Greeter.class) .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); } @Inject Greeter greeter; @Test public void should_create_greeting() { Assert.assertEquals("Hello, Earthling!", greeter.createGreeting("Earthling")); greeter.greet(System.out, "Earthling"); } }38
  39. 39. GreeterTest.java @RunWith(Arquillian.class) public class GreeterTest { @Deployment public static JavaArchive createDeployment() { return ShrinkWrap.create(JavaArchive.class) .addClass(Greeter.class) .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); } @Inject greeter をインジェクト Greeter greeter; @Test public void should_create_greeting() { Assert.assertEquals("Hello, Earthling!", greeter.createGreeting("Earthling")); greeter.greet(System.out, "Earthling"); } }39
  40. 40. GreeterTest.java @RunWith(Arquillian.class) public class GreeterTest { @Deployment テストアーカイブを指定 public static JavaArchive createDeployment() { return ShrinkWrap.create(JavaArchive.class) .addClass(Greeter.class) .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); } @Inject Greeter greeter; @Test public void should_create_greeting() { Assert.assertEquals("Hello, Earthling!", greeter.createGreeting("Earthling")); greeter.greet(System.out, "Earthling"); } }40
  41. 41. GreeterTest.java @RunWith(Arquillian.class) public class GreeterTest { @Deployment public static JavaArchive createDeployment() { return ShrinkWrap.create(JavaArchive.class) .addClass(Greeter.class) .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); } @Inject Greeter greeter; @Test public void should_create_greeting() { Assert.assertEquals("Hello, Earthling!", greeter.createGreeting("Earthling")); greeter.greet(System.out, "Earthling"); } }41
  42. 42. ファイル構成42
  43. 43. ● デモの実行環境 ● Weld 1.1.1.Final ● embedded ● GlassFish 3.1 ● embedded ● JBoss AS 7.1.0.Final ● managed43
  44. 44. Container management ● Embedded ● Remote ● Managed44
  45. 45. Managed mode JUnit45
  46. 46. Managed mode JU Arquillian class (extends BlockJUnit4ClassRunner)46
  47. 47. Managed mode boot arquillian service JAR file47
  48. 48. Managed mode run tests48
  49. 49. Managed mode correct result undeploy shutdown49
  50. 50. Managed mode JU result50
  51. 51. DEMO51
  52. 52. ふりかえり ● テスト実行速度について ● IDE の自動ビルドを利用 ● 最新コンテナ:起動が高速52
  53. 53. 実プロジェクトへの適用 ● 既存のコードへの適用 ● DB 、ネットワーク ● 画面遷移53
  54. 54. 実プロジェクトへの適用 ● 既存のコードへの適用 ● DB 、ネットワーク ● 画面遷移 ● arquillian-showcase を参照してください ● CDI, EJB, EJB(TestNG), JAX-RS, JAX-WS, JMS, JPA, JPA-Lite, JSF, OSGi, Servlet, UI(Selenium) ● https://github.com/arquillian/arquillian-showcase54
  55. 55. 実プロジェクトへの適用 ● 既存のコードへの適用 ● DB 、ネットワーク ● 画面遷移55
  56. 56. 『新規プロジェクトの例なんて、意味がない』56
  57. 57. 『俺たちは、既存コードのメンテナンスを ...57
  58. 58. 強いられているんだ!』58
  59. 59. とお考えの皆さんのためのデモです59
  60. 60. 既存コードへの 容易 / 簡単自動テストの適用 優先的に テストを作成 小 効果 大 徐々に テストを追加60 困難 / 複雑
  61. 61. DEMO ● 既存コードの例: OpenAM ● WAR ファイルを読み込んで、テストアーカイブを作成 ● テストを実行 ● コンテナ: JBoss Enterprise Application Platform 5.1.2 ● OpenAM http://forgerock.com/openam.html61
  62. 62. DEMO62 JU
  63. 63. まとめ63
  64. 64. これまでの Integration Test ● テスト作成が大変 ● 実行に時間がかかる ● テストコードが脆い 効果は期待できるが、テスト作成、維持にコスト がかかる64
  65. 65. Arquillian を利用した Integration Test ● 作成、管理、実行が容易 ● 実行が高速 ● テストコードが脆くない65
  66. 66. 容易 / 簡単Integration Test 小 効果 大66 困難 / 複雑
  67. 67. コンテナでテストをまわせ! Java EE への自動テストの導入 ご清聴ありがとうございました67
  68. 68. References ● Arquillian - JBoss Community ● レガシーコード改善ガイド http://www.jboss.org/arquillian (Michael C. Feathers 著 / ウルシステムズ株式会社 監訳 / 平澤 章、越智典子、稲葉信之、田村友彦、小堀真義 訳 / 翔泳社 刊 ) ● Shrinkwrap - JBoss Community http://www.jboss.org/shrinkwrap/ ● Growing Object-Oriented Software Guided by Tests (Steve Freeman 、 Nat Pryce 著 / Addison-Wesley 刊 ) ● Real Java Enterprise Testing http://slidesha.re/q06oXs ● Jenkins (John Ferguson Smart 著 / Sky 株式会社 玉川 竜司 訳 / オライ ● Throwing complexity over the wall: Rapid development for リージャパン 刊 ) enterprise Java http://slidesha.re/vl8Hkw ● Jenkins 実践入門 ( 佐藤聖規 ( 監修 ) 、和田貴久、河村 雅人、米沢 弘樹、山岸 啓 ● JUnit 著 / 川口 耕介 監修 / 技術評論社 刊 ) http://junit.org/ ● xUnit Test Patterns ● Git (Gerard Meszaros 著 / Addison-Wesley 刊 ) http://git-scm.com/ ● Jenkins CI http://jenkins-ci.org/http://slidesha.re/vl8Hkw ● CloudBees http://www.cloudbees.com/ ● JBoss Tools68 http://www.jboss.org/tools

×