Post on 19-May-2015
description
transcript
Real Java EE Testing withReal Java EE Testing with
ArquillianArquillian andand ShrinkWrapShrinkWrap
Dan AllenDan AllenSenior Software EngineerSenior Software EngineerJBoss, by Red HatJBoss, by Red Hat
Don't fake it!
2 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
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
3 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
Agenda
● Testing, what's the problem?
● Integration testing challenges
● A component model for tests
● ShrinkWrap
● Arquillian
● Case study
#testrevolution
4 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
Why don't we test?
5 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
6 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
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
7 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
Test in-container!Test in-container!
Skip the Build!
8 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
container
n. manages a runtime environment and provides resources,a component model and a set of services
9 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
model for testsmodel for tests
A component
10 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
Unit tests vs integration tests
Unit
● Fine-grained
● Simple
● Test single API call
● Fast, fast, fast
● Easily run in an IDE
Integration
● Coarse-grained
● Complex
● Test intricate web of calls
● Sloooooooow
● Run in an IDE? How?
11 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
Testing bandgap and compounding effort
Unit Tests Integration Tests Functional Tests
Functional complexity
Thought and effort
12 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
Testing continuum with Arquillian
Unit Tests Integration Tests Functional Tests
Functional complexity
Thought and effort
13 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
In-container approach to integration testing
● Separate container process
● Test deployed as archive
● Test runs in-container
● Results collected remotely
14 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
Weighing in-container testing
Pros
● Rely on shared memory
● Pass-by-reference
● Don't need remote views
● Managed concurrency
Cons
● Lack of isolation
● Environment not “true”
15 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
Don't tie your tests to a build!
● Extra, external setup
● Adds time to tests
● Coarse-grained packaging
16 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
n. a simple, Apache-licensed Java API for assembling archiveslike JARs, WARs, EARs; developed by the JBoss Community
17 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
Benefits of ShrinkWrap
● IDE incremental compilation● Save and re-run● Skip the build!
● Simple API
● Tooling views
● Export and debugging
● Micro-deployments
18 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
Fluent archive creation
final JavaArchive archive = ShrinkWrap.create("slsb.jar", JavaArchive.class) .addClasses(Greeter.class, GreeterBean.class);System.out.println(archive.toString(true));
slsb.jar:/com//com/acme//com/acme/app//com/acme/app/ejb3//com/acme/app/ejb3/Greeter.class/com/acme/app/ejb3/GreeterBean.class
Yields output:
19 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
Architecture overview
20 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
n. a simple, Apache-licensed test harness that abstracts awaycontainer lifecycle and deployment from test logic so developerscan easily develop a broad range of integration tests for theirenterprise Java applications; developed by the JBoss Community
21 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
Make integration testing a breeze!
The mission of the Arquillian project is to...
22 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
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")); }}
23 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
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
24 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
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!
25 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
Test frameworks
JUnit TestNG>= 4.6 >= 5.10
26 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
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
27 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
Build, what build?
@Deploymentpublic static JavaArchive createTestArchive() { return ShrinkWrap.create("test.jar", JavaArchive.class) .addClasses(Greeter.class, GreeterBean.class);}
28 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
Skip the build!
@Deploymentpublic static JavaArchive createTestArchive() { return ShrinkWrap.create("test.jar", JavaArchive.class) .addPackage(TranslateController.class.getPackage()) .addManifestResource( new ByteArrayAsset("<beans/>".getBytes()), ArchivePaths.create("beans.xml"));}
29 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
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”
30 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
Containers
● Mode
● Capability
31 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
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
32 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
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
33 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
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;
}
34 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
Test enrichment
● Injection● Fields & method arguments● @Inject, @Resource, @EJB, etc.
● Contexts● Request & Conversation Test method ● Session Test class● Application Test class
● Interceptors & decorators
35 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
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)
36 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
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
37 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
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 ;)
38 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
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?
39 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
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
40 Real Java EE Testing: Arquillian and ShrinkWrap | Dan Allen
http://jboss.org/arquillian
Q & AQ & A
Dan AllenDan AllenSenior Software EngineerSenior Software EngineerJBoss, by Red HatJBoss, by Red Hat
http://jboss.org/arquillianhttp://jboss.org/arquillianhttp://jboss.org/shrinkwraphttp://jboss.org/shrinkwrap