Published on

Arquillian ( is a test harness that simplifies integration testing using container managed resources.

ShrinkWrap ( is a fluent Java API for dynamically generating deployable archives.

Published in: Technology
  • Be the first to comment


  1. 1. Chris Wash<br />CapTech Ventures<br />FYB Aug 2010<br />
  2. 2. Java EE Development Evolution<br />POJO<br />Model<br />Container <br />Services<br />Ease of<br />Development<br />Ease of<br />Testing<br />Framework<br />Integration<br />Dependency<br />Injection<br />JNDI<br />CMP<br />EJB2.x<br />Struts<br />Hibernate<br />EJB3<br />JPA<br />JSF<br />CDI<br />Weld<br />Spring<br />Arquillian<br />Seam<br />“Lightweight” movement<br />Grails<br />
  3. 3. Shift Focus to Testing in EE<br />Lots of developers abandoned EE in search of greener “testing” pastures.<br />Testing has not been the focus for most of the platform’s history.<br />Ride the wave… encourage support and adoption<br />Dev-friendly container-based component models cry out for ease of testability!<br />
  4. 4. Real EE Testing<br />What does “real” mean?<br />Unit testing using doubles can only get us so far when working with container managed resources.<br />Want to be confident we get the interactions correct between container managed resources<br />Short feedback cycle when making a change<br />
  5. 5. Integration Testing<br />
  6. 6. Rolling Your Own<br />How do I get unit test class into the container?<br />Remote deployment (using hook into server)<br />Bootstrap container inside test<br />How do I exercise the code under test?<br />How do I see the results of the test?<br />How does test isolation work?<br />Test classpath-hell<br />Can I call it from IDE and get results?<br />
  7. 7. Challenges to testing in container<br />High barrier to entry<br />Substantial code, configuration and infrastructure<br />Most don’t run from IDE - where’s the feedback?<br />Most aren’t reusable – tied to 1 project’s build<br />Often slow (think “mvn package”)<br />Can’t interact with containers from test (all black-box testing)<br />Enough ROI to justify work/maintenance?<br />
  8. 8. CDI (JSR-299) TCK + ALR EJB3 book examples<br />Used by Weld<br />Plan to be used by JBossAS<br />“Ike” - controls everything in his little world<br />Good way to learn CDI, EJB, JPA, etc.<br />
  9. 9. Arquillian Features<br />JUnit or TestNG compatible<br />Abstracts out server lifecycle and deployment<br />Injects container managed resources into test<br />Zero reliance on build – run straight from IDE<br />Two container modes – remote/embedded<br />Pass-by-reference between test and server<br />Even across JVMs<br />Extensible SPI to plug any container in<br />Single test executed against all containers<br />
  10. 10. Arquillian Architecture<br />
  11. 11. Arquillian: Flexibility<br />Out of the box, supports multiple:<br />Test frameworks (JUnit, TestNG)<br />Containers<br />Enrichers<br />Run Modes<br />Most things are pluggable<br />API/SPI<br />Modular design<br />
  12. 12. ShrinkWrap<br />“Skip the Build!”<br />Fluent API for describing deployable archives<br />Apache-licensed<br />Zero transitive-dependency promise<br />Solves test-classpath madness<br />Removes dependency of integration tests on packaging<br />Creates fine grained archives<br />Contains only what you need<br />
  13. 13. ShrinkWrap<br />
  14. 14. ShrinkWrap<br />IDE can perform incremental compilation<br />Change a class that is ShrinkWrap’d, only that class needs to be recompiled (no repackaging)<br />Poor man’s “hot swap”?<br />Future support tooling views in IDEs<br />See what your archive would look like when SW is executed<br />
  15. 15. ShrinkWrap – Arquillian Integration<br />Simple – method annotated @Deployable within your test class<br />Gets called by ShrinkWrap when deploying your archive, “bundles it” on the fly<br />
  16. 16. Containers<br />Loosely defined, anything that accepts an archive deployment and provides services<br />Arquillian finds specified DeployableContainer SPI on classpath<br />Multiple containers already supported, fairly easy to add support for a container<br />Configured by using Maven profiles, e.g.<br />mvn test –Pjbossas-remote-6<br />
  17. 17. Container Modes<br />Describes how the test archive should be deployed<br />Embedded<br />Same JVM<br />Bootstraps container, often “standalone” environment<br />Managed<br />Different JVM, same machine<br />Server will be started/stopped as part of the test run<br />Remote<br />Different JVM, different machine<br />Server startup/shutdown not controlled by ARQ<br />Arquillian controls binding/unbinding to server<br />
  18. 18.
  19. 19. Container Support<br />Notably, no Weblogic and no WebSphere yet<br />Looking for community contribution<br />No Spring or Hibernate yet, but they’re planned.<br />
  20. 20. Enrichers<br />Allow for injections into your test from within a container<br />Out of the box, supports:<br />@Resource (ghetto!)<br />@EJB (a few caveats)<br />@Inject (CDI)<br />Transparent to user – internal lifecycle step before executing test methods<br />
  21. 21. Run Modes<br />IN_CONTAINER<br />AS_CLIENT<br />Arquillian uses this when running your test (after enrichment)<br />Determines which side of the client/server divide the test method should be executed on<br />See LocalRunServletTestCase<br />
  22. 22. Embedded Lifecycle<br />Bundle test archive*<br />Use ShrinkWrap’d archive<br />Bootstrap container<br />Deploy archive to container<br />Enrich test class<br />Execute tests<br />After execution, undeploy archive<br />Stop container<br />Display captured test results<br />
  23. 23. Managed Lifecycle<br />Bundle test archive*<br />Use ShrinkWrap’d archive<br />Add test class and invoker<br />Bootstrap server<br />Deploy archive to container<br />Enrich test class<br />Negotiate test method execution (based on Run Mode)<br />Collect test results, return back thru Arquillian<br />After execution, undeploy archive<br />Stop server<br />Display test results returned from server<br />
  24. 24. Remote Lifecycle<br />Bundle test archive*<br />Use ShrinkWrap’d archive<br />Add test class and invoker<br />Bind to container<br />Deploy archive to container<br />Inside container, enrich test class<br />Negotiate test method execution (based on Run Mode)<br />Collect test results, return back thru Arquillian<br />After execution, undeploy archive<br />Unbind from container<br />Display test results returned from server<br />
  25. 25. Test Execution/SPI Overview<br />
  26. 26. Demo<br />
  27. 27. The Cons<br />Lack of true test isolation<br />Implementing feature to deal with isolation<br />If using an Embedded container you’re in a “Simulated” environment<br />Easy to turn an embedded test into a remote test<br />
  28. 28. The Pros<br /> Scale up to the level of integration you need by growing your test archive<br />Rely on shared memory<br />Don’t have to return/serialize a lot of state just to do asserts on<br />Pass-by-reference works<br />Don’t need remote views exposed just to test<br />Managed concurrency<br />Multiple containers for free<br />
  29. 29. Future<br />*Bundling – read Maven pom.xml and run through dependency resolution algorithm to include required dependencies<br />Support for more Containers<br />Performance monitoring<br />Archive “bundle-time” class manipulation<br />Exception, Callback, Assertion injection<br />Component coverage recording<br />Tooling support<br />Framework integration<br />Selenium, HTTPUnit, DBUnit, easyB<br />
  30. 30. #jbosstesting initiatives<br />Establish testing culture in Java EE!<br />Other frameworks<br />Placeebo – Mock Java EE API implementations (Fakes)<br />JSFUnit – Gray-box JSF testing (Pretty cool, if you’ve seen SeamTest in action)<br />
  31. 31. Further Info<br />Chris Wash, @cwash (Twitter, Yammer)<br />Use #testrevolutionhashtag<br />Material jacked from the following sites:<br /><br /><br /><br />IRC<br />Sites<br /><br /><br />Source<br /><br />