SlideShare a Scribd company logo
コンテナでテストをまわせ!
          Java EE への自動テストの導入

    小西 高之
    JBoss Technical Support Engineer
1   Red Hat K.K.
コンテナでテストをまわせ!
    Twitter ハッシュタグ: #jt12_b202

    小西 高之
    @leather_sole
2
とあるプロジェクトで ...

『これからアプリケーションのテストを始める』
『はい!』
『まずはこのテストだ!』



3
!?
4
『そんなの意味がないですよ!』




5
『そうさ、意味なんかない』




6
『俺たちは、




7
『俺たちは、こんなテストを ...




8
強いられているんだ!』
9
とお考えの皆さんのためのセッションです




10
今日話すこと
     ●
         自動テストの考え方
     ●
         テストフレームワークのご紹介
     ●
         デモ
     ●
         実際のプロジェクトへの適用
     ●
         まとめ




11
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
                                                  Database
12
自動テスト
     ●
         メリット
         ●
             リグレッションテスト
         ●
             再現可能
         ●
             実行時に人手が不要
     ●
         デメリット
         ●
             テスト作成
         ●
             メンテナンス




13
各テスト自動化の              容易 / 簡単
難易度と効果                テストの作成・メンテナンス・
                      実行前処理・実行・結果確認・
                      事後処理の難易度



     小   効果                            大
     テストの明確さ、テスト対象の
     変更可能性などによる自動化の
     効果




14
                      困難 / 複雑
容易 / 簡単
                        優先的に
                        テストを作成



     小   効果                大

     自動化以外の
     方法を考える
15
              困難 / 複雑
テストの分類
     ● Unit Test
     ● Integration Test


     ● System Test




16
Unit Test
     ●
         個々のクラスのテスト
     ●
         JVM 内で閉じている
     ●
         実行速度が速い
     ●
         Java EE 5 以降、容易にテストできるようになった
     ●
         コンテナの機能を補うためのオブジェクトが必要



17
Integration Test
     ●
         コンポーネントのテスト
         ●
             例)秘密鍵ファイルを使って XML に署名する
     ●
         コンテナ、ネットワーク、 DB 、ファイルなどを使用




18
System Test
     ●
         フィーチャーのテスト
         ●
             例)ユーザーとしてシステムにユーザー情報を登録する
     ●
         コンテナ、ネットワーク、 DB 、ファイルなどを使用




19
容易 / 簡単
Unit Test



     小   効果             大




20
              困難 / 複雑
容易 / 簡単
Integration Test



     小   効果                  大




21
                   困難 / 複雑
容易 / 簡単
System Test



     小   効果             大




22
              困難 / 複雑
Integration Test の問題点

     ●
         テスト作成が大変
     ●
         実行に時間がかかる
     ●
         テストコードが脆い

         効果は期待できるが、テスト作成、維持にコスト
         がかかる
23
容易 / 簡単
Integration Test



     小   効果                  大




24
                   困難 / 複雑
容易 / 簡単
After



     小   効果             大




25
              困難 / 複雑
26
Integration Test を自動化する力が欲しいか ... ?




27
Integration Test を自動化する力が欲しいか ... ?




28
29
Integration Test
     Framework のご紹介


         http://arquillian.org/
30
https://github.com/arquillian




31
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+containers
32
Arquillian の特徴
     ●
         JUnit/TestNG のテストケースとしてテストを作成
     ●
         ビルドツール非依存
     ●
         IDE の自動ビルド機能と連携
     ●
         拡張可能
         ●
             ( 開発中 ) Selenium, DBUnit, Andloid ...



33
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/rhq
34
例
     CDI Bean のテスト



35
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
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
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
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
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
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
●
     デモの実行環境
     ●
         Weld 1.1.1.Final
         ●
             embedded
     ●
         GlassFish 3.1
         ●
             embedded
     ●
         JBoss AS 7.1.0.Final
         ●
             managed


43
Container management
     ●
         Embedded
     ●
         Remote
     ●
         Managed




44
Managed mode




     JUnit
45
Managed mode



     JU   Arquillian class
          (extends
          BlockJUnit4ClassRunner)

46
Managed mode



     boot

     arquillian service
     JAR file

47
Managed mode




     run tests




48
Managed mode


     correct result

       undeploy

       shutdown

49
Managed mode



     JU
          result




50
DEMO



51
ふりかえり
     ●
         テスト実行速度について
         ●
             IDE の自動ビルドを利用
         ●
             最新コンテナ:起動が高速




52
実プロジェクトへの適用
     ●
         既存のコードへの適用
     ●
         DB 、ネットワーク
     ●
         画面遷移




53
実プロジェクトへの適用

     ●
         既存のコードへの適用
     ●
         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-showcase
54
実プロジェクトへの適用
     ●
         既存のコードへの適用
     ●
         DB 、ネットワーク
     ●
         画面遷移




55
『新規プロジェクトの例なんて、意味がない』




56
『俺たちは、既存コードのメンテナンスを ...




57
強いられているんだ!』
58
とお考えの皆さんのためのデモです




59
既存コードへの            容易 / 簡単
自動テストの適用                     優先的に
                             テストを作成



     小   効果                     大
          徐々に
          テストを追加



60
                   困難 / 複雑
DEMO
     ●
         既存コードの例: OpenAM
     ●
         WAR ファイルを読み込んで、テストアーカイブを作成
     ●
         テストを実行
         ●
             コンテナ: JBoss Enterprise Application Platform 5.1.2

     ●
         OpenAM
         http://forgerock.com/openam.html
61
DEMO




62
     JU
まとめ




63
これまでの Integration Test

     ●
         テスト作成が大変
     ●
         実行に時間がかかる
     ●
         テストコードが脆い

         効果は期待できるが、テスト作成、維持にコスト
         がかかる

64
Arquillian を利用した Integration Test

     ●
         作成、管理、実行が容易
     ●
         実行が高速
     ●
         テストコードが脆くない




65
容易 / 簡単
Integration Test



     小   効果                  大




66
                   困難 / 複雑
コンテナでテストをまわせ!
         Java EE への自動テストの導入



     ご清聴ありがとうございました


67
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 Tools
68       http://www.jboss.org/tools

More Related Content

PDF
Integration test with Arquillian and JBoss AS 7
PDF
Migration Guide from Java 8 to Java 11 #jjug
PDF
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
PDF
Head toward Java 13 and Java 14 #jjug
PPT
Maven2 plugin
PPTX
Java をクラッシュさせて遊んでみよう!
PPTX
Java EE パフォーマンスTips #glassfish_jp
PPTX
Heap statsfx analyzer
Integration test with Arquillian and JBoss AS 7
Migration Guide from Java 8 to Java 11 #jjug
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
Head toward Java 13 and Java 14 #jjug
Maven2 plugin
Java をクラッシュさせて遊んでみよう!
Java EE パフォーマンスTips #glassfish_jp
Heap statsfx analyzer

What's hot (20)

PDF
Java Batch 仕様 (Public Review時点)
PDF
Head toward Java 15 and Java 16
PPTX
継続的インテグレーション3分クッキング
PDF
Head toward Java 16 (Night Seminar Edition)
PDF
TDD勉強会キックオフ for Java
PDF
テストゼロからイチに進むための戦略と戦術
PDF
大規模な負荷でもドキドキしない為のJava EE
PDF
JavaScriptでWebDriverのテストコードを書きましょ
PDF
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
PDF
Grailsのススメ(仮)
PPTX
Jsf アプリ作ったった
PDF
WildFly Swarmではじめる「パーツとしてのJavaEE」
PDF
Advanced database monitoring in modern java
PDF
Visual Studio 2012 Native Debugger Feature
PDF
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
PPTX
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
PDF
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
PDF
クラスローダーについて
PDF
ClassLoader Leak Patterns
PDF
Gradle a new Generation Build Tool
Java Batch 仕様 (Public Review時点)
Head toward Java 15 and Java 16
継続的インテグレーション3分クッキング
Head toward Java 16 (Night Seminar Edition)
TDD勉強会キックオフ for Java
テストゼロからイチに進むための戦略と戦術
大規模な負荷でもドキドキしない為のJava EE
JavaScriptでWebDriverのテストコードを書きましょ
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Grailsのススメ(仮)
Jsf アプリ作ったった
WildFly Swarmではじめる「パーツとしてのJavaEE」
Advanced database monitoring in modern java
Visual Studio 2012 Native Debugger Feature
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
Jjug ccc 2016 spring i 5 javaデスクトッププログラムを云々
クラスローダーについて
ClassLoader Leak Patterns
Gradle a new Generation Build Tool
Ad

Viewers also liked (20)

PDF
CDI Extensions e DeltaSpike
PDF
Java EE 再入門
PDF
Electing A President Individual Quiz
PPT
Bloodbaths Website
PPT
coisas boas
PDF
Small Business Owners' Work-Life Balance
PDF
Eal brandon
PDF
Marca personal
PDF
I need the data and I need it 1ms ago!
PDF
ikd312-09-normalisasi
PDF
Art renaixement
PPT
Pipeline 4 Progress Action Plan Summary
PDF
Absolute Dosimetry for Proton Beams-Doktorandenseminar 11 Sept 2008
PPT
Carteles art nouveau redux
KEY
API Design
PDF
My coke
PDF
Vision for Haverhill Comprehensive Plan Concept & Framework
PDF
Concurso emasagra 2013
PDF
Zend Certified Engineer & Zend Framework
PDF
Sarah Robins Powell resume/work sample
CDI Extensions e DeltaSpike
Java EE 再入門
Electing A President Individual Quiz
Bloodbaths Website
coisas boas
Small Business Owners' Work-Life Balance
Eal brandon
Marca personal
I need the data and I need it 1ms ago!
ikd312-09-normalisasi
Art renaixement
Pipeline 4 Progress Action Plan Summary
Absolute Dosimetry for Proton Beams-Doktorandenseminar 11 Sept 2008
Carteles art nouveau redux
API Design
My coke
Vision for Haverhill Comprehensive Plan Concept & Framework
Concurso emasagra 2013
Zend Certified Engineer & Zend Framework
Sarah Robins Powell resume/work sample
Ad

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

PDF
Webアプリの動的部分に着目したグレーボックス統合テストとテンプレート変数カバレッジの提案
PDF
SimpleModeler
PPT
2012年javaメモリリーク
PDF
Awsで実現するseleniumテスト高速術
KEY
Jenkins javascript ci
PPTX
20140518 JJUG MySQL Clsuter as NoSQL
KEY
Functional Testing in #YAPCASIA
PPTX
Beginning Java EE 6 勉強会(1) #bje_study
PPTX
はじめてのJPA
PDF
JavaOne2015報告またはこれからのJava
PDF
JVMの中身を可視化してみた
PDF
SDLoader SeasarCon 2009 Whire
PPTX
Beginning Java EE 6 勉強会(3) #bje_study
PDF
Rx java x retrofit
PDF
Gradle handson
PDF
Gradleどうでしょう
PDF
脱・独自改造! GebでWebDriverをもっとシンプルに
PDF
これからのJDK/JVM 何を選ぶ?どう選ぶ?
PDF
継続的デリバリー読書会 第 7 章 コミットステージ
PDF
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Webアプリの動的部分に着目したグレーボックス統合テストとテンプレート変数カバレッジの提案
SimpleModeler
2012年javaメモリリーク
Awsで実現するseleniumテスト高速術
Jenkins javascript ci
20140518 JJUG MySQL Clsuter as NoSQL
Functional Testing in #YAPCASIA
Beginning Java EE 6 勉強会(1) #bje_study
はじめてのJPA
JavaOne2015報告またはこれからのJava
JVMの中身を可視化してみた
SDLoader SeasarCon 2009 Whire
Beginning Java EE 6 勉強会(3) #bje_study
Rx java x retrofit
Gradle handson
Gradleどうでしょう
脱・独自改造! GebでWebDriverをもっとシンプルに
これからのJDK/JVM 何を選ぶ?どう選ぶ?
継続的デリバリー読書会 第 7 章 コミットステージ
Javaはどのように動くのか~スライドでわかるJVMの仕組み

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

  • 1. コンテナでテストをまわせ! Java EE への自動テストの導入 小西 高之 JBoss Technical Support Engineer 1 Red Hat K.K.
  • 2. コンテナでテストをまわせ! Twitter ハッシュタグ: #jt12_b202 小西 高之 @leather_sole 2
  • 11. 今日話すこと ● 自動テストの考え方 ● テストフレームワークのご紹介 ● デモ ● 実際のプロジェクトへの適用 ● まとめ 11
  • 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 Database 12
  • 13. 自動テスト ● メリット ● リグレッションテスト ● 再現可能 ● 実行時に人手が不要 ● デメリット ● テスト作成 ● メンテナンス 13
  • 14. 各テスト自動化の 容易 / 簡単 難易度と効果 テストの作成・メンテナンス・ 実行前処理・実行・結果確認・ 事後処理の難易度 小 効果 大 テストの明確さ、テスト対象の 変更可能性などによる自動化の 効果 14 困難 / 複雑
  • 15. 容易 / 簡単 優先的に テストを作成 小 効果 大 自動化以外の 方法を考える 15 困難 / 複雑
  • 16. テストの分類 ● Unit Test ● Integration Test ● System Test 16
  • 17. Unit Test ● 個々のクラスのテスト ● JVM 内で閉じている ● 実行速度が速い ● Java EE 5 以降、容易にテストできるようになった ● コンテナの機能を補うためのオブジェクトが必要 17
  • 18. Integration Test ● コンポーネントのテスト ● 例)秘密鍵ファイルを使って XML に署名する ● コンテナ、ネットワーク、 DB 、ファイルなどを使用 18
  • 19. System Test ● フィーチャーのテスト ● 例)ユーザーとしてシステムにユーザー情報を登録する ● コンテナ、ネットワーク、 DB 、ファイルなどを使用 19
  • 20. 容易 / 簡単 Unit Test 小 効果 大 20 困難 / 複雑
  • 21. 容易 / 簡単 Integration Test 小 効果 大 21 困難 / 複雑
  • 22. 容易 / 簡単 System Test 小 効果 大 22 困難 / 複雑
  • 23. Integration Test の問題点 ● テスト作成が大変 ● 実行に時間がかかる ● テストコードが脆い 効果は期待できるが、テスト作成、維持にコスト がかかる 23
  • 24. 容易 / 簡単 Integration Test 小 効果 大 24 困難 / 複雑
  • 25. 容易 / 簡単 After 小 効果 大 25 困難 / 複雑
  • 26. 26
  • 29. 29
  • 30. Integration Test Framework のご紹介 http://arquillian.org/ 30
  • 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+containers 32
  • 33. Arquillian の特徴 ● JUnit/TestNG のテストケースとしてテストを作成 ● ビルドツール非依存 ● IDE の自動ビルド機能と連携 ● 拡張可能 ● ( 開発中 ) Selenium, DBUnit, Andloid ... 33
  • 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/rhq 34
  • 35. CDI Bean のテスト 35
  • 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. 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. 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. 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. 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. 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
  • 43. デモの実行環境 ● Weld 1.1.1.Final ● embedded ● GlassFish 3.1 ● embedded ● JBoss AS 7.1.0.Final ● managed 43
  • 44. Container management ● Embedded ● Remote ● Managed 44
  • 45. Managed mode JUnit 45
  • 46. Managed mode JU Arquillian class (extends BlockJUnit4ClassRunner) 46
  • 47. Managed mode boot arquillian service JAR file 47
  • 48. Managed mode run tests 48
  • 49. Managed mode correct result undeploy shutdown 49
  • 50. Managed mode JU result 50
  • 52. ふりかえり ● テスト実行速度について ● IDE の自動ビルドを利用 ● 最新コンテナ:起動が高速 52
  • 53. 実プロジェクトへの適用 ● 既存のコードへの適用 ● DB 、ネットワーク ● 画面遷移 53
  • 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-showcase 54
  • 55. 実プロジェクトへの適用 ● 既存のコードへの適用 ● DB 、ネットワーク ● 画面遷移 55
  • 60. 既存コードへの 容易 / 簡単 自動テストの適用 優先的に テストを作成 小 効果 大 徐々に テストを追加 60 困難 / 複雑
  • 61. DEMO ● 既存コードの例: OpenAM ● WAR ファイルを読み込んで、テストアーカイブを作成 ● テストを実行 ● コンテナ: JBoss Enterprise Application Platform 5.1.2 ● OpenAM http://forgerock.com/openam.html 61
  • 62. DEMO 62 JU
  • 64. これまでの Integration Test ● テスト作成が大変 ● 実行に時間がかかる ● テストコードが脆い 効果は期待できるが、テスト作成、維持にコスト がかかる 64
  • 65. Arquillian を利用した Integration Test ● 作成、管理、実行が容易 ● 実行が高速 ● テストコードが脆くない 65
  • 66. 容易 / 簡単 Integration Test 小 効果 大 66 困難 / 複雑
  • 67. コンテナでテストをまわせ! Java EE への自動テストの導入 ご清聴ありがとうございました 67
  • 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 Tools 68 http://www.jboss.org/tools