September 2010 - Arquillian

1,901 views

Published on

Aslak Knutsen Red Hat - JBug Rome September 2010 -

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,901
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
33
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

September 2010 - Arquillian

  1. 1. Real Java EE Testing with Arquillian and ShrinkWrap Don't mock me. Aslak Knutsen Senior Software Engineer JBoss, by Red Hat
  2. 2. Agenda #arquillian ● Barriers to testing ● Rethinking integration testing ● ShrinkWrap ● Arquillian ● Demo, demo, demo ● Future ● Q&A 2 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  3. 3. Unit tests vs integration tests Unit Integration ● Fine-grained ● Coarse-grained ● Simple ● Complex ● Single API call ● Component interactions ● Fast, fast, fast ● Sloooooooow ● Easily run in an IDE ● Run in an IDE? How? 3 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  4. 4. Common integration testing challenges ● Start a container environment ● Run a build to create/deploy application archive ● Mock dependent components ● Configure application to use test data source(s) ● Deal with (lack of) classpath isolation 4 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  5. 5. The “testing bandgap” and compounding effort Thought and Effort Functional complexity Configuration complexity Unit Tests Integration Tests Functional Tests 5 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  6. 6. What if integration testing could be... ● as easy as writing a unit test ● run in the IDE, leveraging incremental builds ● limited to select components running in isolation ● ...avoiding the “big bang” integration roadblock 6 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  7. 7. Skip the Build! Test in-container! 7 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  8. 8. An in-container approach to integration testing 1. Start or connect to a container 2. Package and deploy test case* as archive 3. Run test in-container 4. Collect results 5. Undeploy test archive 8 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  9. 9. container n. a process that manages a runtime environment and provides resources, a component model and a set of services 9 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  10. 10. Containers and components ● Component ● Follows standard programming model ● Encapsulates business logic ● Packaged in deployable archive ● Container ● Loads and executes components ● Provides services and resources 10 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  11. 11. s ing mis What's been from Java EE? ^ 11 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  12. 12. A component model for your tests 12 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  13. 13. Arquillian's testing continuum Reducing enterprise testing to child's play Thought and Effort Functional complexity Configuration complexity Unit Tests Integration Tests Functional Tests 13 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  14. 14. How do we get there? 14 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  15. 15. Step 1: Liberate tests from the build! ● Adds overhead to development cycle ● Slows down test execution ● Uses coarse-grained classpath/package ● Keep it manageable! ● Well-defined “unit” ● Classpath control 15 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  16. 16. Project lead: Andrew Lee Rubinger n. a fluent Java API for programmatic creation of archives like JARs, WARs and EARs; developed by the JBoss Community 16 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  17. 17. Benefits of ShrinkWrap ● Incremental IDE compilation ● Save and re-run ● Skip the build! ● Simple, fluent API ● Micro deployments ● Export and debugging ● Tooling views (future) 17 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  18. 18. Fluent archive creation final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "slsb.jar") .addClasses(Greeter.class, GreeterBean.class); System.out.println(archive.toString(true)); Yields output: slsb.jar: /com/ /com/acme/ /com/acme/app/ /com/acme/app/ejb3/ /com/acme/app/ejb3/Greeter.class /com/acme/app/ejb3/GreeterBean.class 18 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  19. 19. Build, what build? @Deployment public static Archive<?> createDeployment() { return ShrinkWrap.create(JavaArchive.class) .addClasses(Greeter.class, GreeterBean.class); } 19 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  20. 20. Skip the build! @Deployment public static Archive<?> createDeployment() { return ShrinkWrap.create(JavaArchive.class) .addPackage(TemperatureConverter.class.getPackage()) .addManifestResource(EmptyAsset.INSTANCE, "beans.xml"); } 20 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  21. 21. Step 2: Gut the plumbing! ● Manage lifecycle of container ● Enrich test class ● Package test archive ● Deploy test archive ● Invoke tests ● Capture test results ● What's left? ● Pure test logic 21 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  22. 22. Project lead: Aslak Knutsen n. a container-oriented testing framework that abstracts away container lifecycle and deployment from test logic so developers can easily develop a broad range of integration tests for their enterprise Java applications; developed by the JBoss Community 22 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  23. 23. Arquillian project mission Make integration testing a breeze! 23 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  24. 24. Prove it. @RunWith(Arquillian.class) public class GreeterTestCase { @Deployment public static Archive<?> createDeployment() { return ShrinkWrap.create(JavaArchive.class) .addClasses(Greeter.class, GreeterBean.class); } @EJB private Greeter greeter; @Test public void shouldBeAbleToInvokeEJB() throws Exception { assertEquals("Hello, Earthlings", greeter.greet("Earthlings")); } } 24 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  25. 25. Benefits of Arquillian ● Write less (test) code ● As much or as little “integration” as you need ● Looks like a unit test, but you're in a real environment! ● Easily lookup component to test ● No hesitation when you need a resource ● Run same test in multiple containers ● It's a learning environment 25 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  26. 26. How is a container selected? ● Explain... 26 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  27. 27. Arquillian tactical unit ● Unit testing framework runner ● Deployable test archive ● Test enrichers ● Test run mode ● Target container ● Test framework integrations 27 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  28. 28. Supported unit testing frameworks JUnit TestNG >= 4.8.1 >= 5.12.1 28 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  29. 29. Test archive ● Assembled using ShrinkWrap API ● Declared with static @Deployment method ● Bundles: ● Class/component to test ● Supporting classes ● Configuration and resource files ● Dependent libraries 29 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  30. 30. Micro deployments ● Deploy components in isolation ● Test one functional unit at a time ● Don't need to wait for full application build/startup ● Incremental integration ● Hand pick components & resources ● No “big bang” integration 30 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  31. 31. Test enrichment ● Injection ● Fields & method arguments ● @Inject, @Resource, @EJB, @PersistenceContext, ... ● CDI producer methods in test class ● Context management ● Request & Conversation  Test method ● Session  Test class ● Application  Test class ● More to come... 31 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  32. 32. Test run modes ● In-container ● Test bundled with @Deployment archive ● Archive deployed to container ● Test runs inside container alongside application code ● Test invokes application code directly (same JVM) ● As client ● @Deployment archive is test archive (unmodified) ● Archive deployed to the container ● Test runs in original test runner ● Test interacts as a remote client (e.g., HTTP client) 32 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  33. 33. Classifying the containers ● By mode ● By compliance 33 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  34. 34. Container modes ● Embedded ● Same JVM as test runner ● Test protocol either local or remote ● Lifecycle controlled by Arquillian ● Remote ● Separate JVM from test runner ● Arquillian connects to running container ● Tests executed over remote protocol ● Managed ● Remote with lifecycle management 34 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  35. 35. Container compliance ● Java EE application server (JBoss AS, GlassFish, etc) ● Servlet container (Tomcat, Jetty) ● Managed bean container (Weld SE, Spring) ● OSGi ● Whatever else comes along... 35 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  36. 36. Supported containers ● JBoss AS 5.0 & 5.1 – Managed and remote ● JBoss AS 6 – Managed, remote and embedded ● JBoss JCA – Embedded ● GlassFish 3 – Remote and embedded ● Weld – SE embedded and EE mock embedded ● OpenWebBeans – embedded ● OpenEJB 3.1 – embedded ● OSGi – embedded ● Tomcat 6, Jetty 6.1 and Jetty 7 – embedded ● More on the way... 36 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  37. 37. Container SPI, not just for Java EE public interface DeployableContainer { void setup(Context context, Configuration configuration); void start(Context context) throws LifecycleException; ContainerMethodExecutor deploy(Context context, Archive<?> archive) throws DeploymentException; void undeploy(Context context, Archive<?> archive) throws DeploymentException; void stop(Context context) throws LifecycleException; } 37 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  38. 38. Power tools: test framework integration ● Test frameworks are services too ● Extend component model for tests ● Examples: ● JSFUnit* ● Cobertura ● HTTPUnit ● DBUnit ● Selenium * available 38 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  39. 39. Arquillian... ● is a container-oriented testing framework ● provides a component model for tests ● handles test infrastructure & plumbing ● ships with a set of container implementations ● provides a little bit of magic ;) 39 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  40. 40. Arquillian invasion strategy ● 1.0.0.Alpha3 out! ● More containers ● More framework integrations ● DBUnit, HTTPUnit, Selenium ● Cloud ● Performance extension ● Component coverage ● Package-time bytecode manipulation ● Exception, callback, assertion injection ● Tooling 40 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  41. 41. We're in print! LOOK INSIDE! Enterprise JavaBeans 3.1, Sixth Edition O’Reilly - Andrew Lee Rubinger, et al http://community.jboss.org/groups/oreillyejb6th 41 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  42. 42. Get involved! ● Participate with us! ● Share ideas on the forums (or IRC) ● Give us feedback on releases – still in alpha! ● Fork us! ● http://github.com/arquillian ● Meet us! ● #jbosstesting channel on irc.freenode.net ● Write for us! ● Share your stories – Blog! Tweet! ● Document how it works 42 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  43. 43. The JBoss Testing Initiative ● Comprehensive testing tool “stack” ● Establish a testing culture in Java EE ● #jbosstesting channel on irc.freenode.net ● Filling voids ● ShrinkWrap – Programmatic archive creation ● Arquillian – Managed integration testing ● JSFUnit – Gray-box JSF testing ● Placeebo – Mock Java EE API implementations ● Descriptors ● Unit testing framework enhancements? 43 Real Java EE Testing: Arquillian and ShrinkWrap | Aslak Knutsen
  44. 44. Q&A http://jboss.org/arquillian http://jboss.org/shrinkwrap

×