Dan Allen presents on Arquillian and ShrinkWrap, tools for integration testing Java EE applications. Arquillian manages the lifecycle of containers to make integration testing easier. ShrinkWrap provides a simple API for programmatically assembling archives like JARs and WARs. Together they allow tests to run inside containers with the application code, avoiding lengthy builds. The talk demonstrates how to write tests using Arquillian and ShrinkWrap that inject resources and run application code directly in the same JVM for fast, isolated testing of Java EE components.
Real Java EE Testing with Arquillian and ShrinkWrap
1. Real Java EE Testing with
Arquillian and ShrinkWrap
Don't fake it!
Dan Allen
Senior Software Engineer
JBoss, by Red Hat
2. Who am I?
● Author of Seam in Action, Manning 2008
● Seam Community Liaison
● Weld, Seam & Arquillian project member
● JSR-314 (JSF 2) EG representative
● Open Source advocate
mojavelinux
2 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
3. Agenda #testrevolution
● Testing, what's the problem?
● Integration testing challenges
● A component model for tests
● ShrinkWrap
● Arquillian
● Case study
3 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
4. Why don't we test?
4 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
5. 5 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
6. Common integration testing challenges
● Active mocks to stand in for collaborators
● Configure application to use test data source(s)
● Deal with (lack of) classpath isolation
● Run a build to create/deploy application archive
6 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
7. Skip the Build!
Test in-container!
7 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
8. container
n. manages a runtime environment and provides resources,
a component model and a set of services
8 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
9. A component
model for tests
9 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
10. Unit tests vs integration tests
Unit Integration
● Fine-grained ● Coarse-grained
● Simple ● Complex
● Test single API call ● Test intricate web of calls
● Fast, fast, fast ● Sloooooooow
● Easily run in an IDE ● Run in an IDE? How?
10 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
11. Testing bandgap and compounding effort
Functional complexity
Thought and effort
Unit Tests Integration Tests Functional Tests
11 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
12. Testing continuum with Arquillian
Functional complexity
Thought and effort
Unit Tests Integration Tests Functional Tests
12 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
13. In-container approach to integration testing
● Separate container process
● Test deployed as archive
● Test runs in-container
● Results collected remotely
13 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
14. Weighing in-container testing
Pros Cons
● Rely on shared memory ● Lack of isolation
● Pass-by-reference ● Environment not “true”
● Don't need remote views
● Managed concurrency
14 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
15. Don't tie your tests to a build!
● Extra, external setup
● Adds time to tests
● Coarse-grained packaging
15 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
16. n. a simple, Apache-licensed Java API for assembling archives
like JARs, WARs, EARs; developed by the JBoss Community
16 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
17. Benefits of ShrinkWrap
● IDE incremental compilation
● Save and re-run
● Skip the build!
● Simple API
● Tooling views
● Export and debugging
● Micro-deployments
17 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
18. Fluent archive creation
final JavaArchive archive = ShrinkWrap.create("slsb.jar", JavaArchive.class)
.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 | Dan Allen
20. n. a simple, Apache-licensed test harness 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
20 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
21. The mission of the Arquillian project is to...
Make integration testing a breeze!
21 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
22. Prove it!
@RunWith(Arquillian.class)
public class GreeterTestCase {
@Deployment
public static JavaArchive createTestArchive() {
return ShrinkWrap.create("test.jar", JavaArchive.class)
.addClasses(Greeter.class, GreeterBean.class);
}
@EJB private Greeter greeter;
@Test
public void shouldBeAbleToInjectEJB() throws Exception {
assertEquals("Hello, Earthlings", greeter.greet("Earthlings"));
}
}
22 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
23. Arquillian guts the plumbing
● Manages lifecycle of container
● start/stop
● bind/unbind
● Enriches test class (e.g, @Inject, @EJB, @Resource)
● Bundles test archive
● code under test
● libraries
● test class and invoker (in-container run mode only)
● Negotiates deployment of test archive
● Captures test results and failures
23 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
24. Benefits of Arquillian
● Write less (test) code
● As much or as little “integration” as you need
● Looks like a unit test, get fully functioning components
● Simple way to get an instance of component under test
● You don't hesitate when you need a resource
● Same test, multiple containers
● It's the real deal!
24 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
25. Test frameworks
JUnit TestNG
>= 4.6 >= 5.10
25 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
26. Test archives
● Built using ShrinkWrap API
● Bundle:
● code under test
● dependent Libraries
● test class and invoker (in-container run mode only)
● Deployed to container before test is executed
● Undeployed after test is executed
26 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
27. Build, what build?
@Deployment
public static JavaArchive createTestArchive() {
return ShrinkWrap.create("test.jar", JavaArchive.class)
.addClasses(Greeter.class, GreeterBean.class);
}
27 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
28. Skip the build!
@Deployment
public static JavaArchive createTestArchive() {
return ShrinkWrap.create("test.jar", JavaArchive.class)
.addPackage(TranslateController.class.getPackage())
.addManifestResource(
new ByteArrayAsset("<beans/>".getBytes()),
ArchivePaths.create("beans.xml"));
}
28 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
29. Micro deployments
● Deploy components in isolation
● Test one slice at a time
● Don't need to wait for full application build/startup
● Tune size of integration
● Layers by inclusion
● No “big bang”
29 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
30. Containers
● Mode
● Capability
30 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
31. Container modes
● Embedded
● Same JVM as test runner
● Tests executed by native test runner
● Lifecycle controlled by Arquillian
● Remote
● Separate JVM from test runner
● Tests executed over remote protocol
● Arquillian likely binds to ports
31 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
32. Container capabilities
● Java EE application server (JBoss AS, GlassFish, etc)
● Servlet container (Tomcat, Jetty)
● Managed bean container (Weld SE, Spring)
● OSGi
● SPI allows you to introduce any other container
32 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
33. 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;
}
33 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
34. Test enrichment
● Injection
● Fields & method arguments
● @Inject, @Resource, @EJB, etc.
● Contexts
● Request & Conversation Test method
● Session Test class
● Application Test class
● Interceptors & decorators
34 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
35. Test run modes
● In-container
● Test bundled in @Deployment archive
● Archive deployed to container
● Test runs inside container with code under test
● Test invokes code under test directly (same JVM)
● Local
● @Deployment archive unmodified
● Archive deployed to the container
● Test runs in original test runner
● Test interacts as a remote client (e.g., HTTP client)
35 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
36. In-container testing MDBs: A case study
● Asynchronous
● How will client know server is done processing?
● Thread.sleep() is prone to transient failures
● No return value
● How do we check post-conditions?
● In-container == same JVM
● Gives test control
● Allows test to inspect contexts
36 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
37. Arquillian is...
● an innovative approach to testing
● a component model for tests
● test infrastructure & plumbing
● a set of container implementations
● a little bit of magic ;)
37 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
38. JBoss Testing Initiative
● Comprehensive testing tool “stack”
● Establish a testing culture in Java EE
● #jbosstesting on irc.freenode.net
● Filling voids
● ShrinkWrap – Programmatic archive creation
● Arquillian – Managed integration testing
● Placeebo – Mock Java EE API implementations
● JSFUnit – Gray-box JSF testing
● Contribute to the unit testing frameworks?
38 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
39. Get Involved!
● Active and open community
● How to contribute:
● Ideas on forums or IRC
● Feedback on releases – still in alpha!
● Enhancements and bug fixes – we love patches!
● Documentation
● Blogs – share your stories!
● Come meet us:
● http://jboss.org/arquillian
● #jbosstesting on irc.freenode.net
39 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen