Skip navigation
1 2 Previous Next

Arquillian

17 Posts authored by: dan.j.allen

Arquillian is now on Google+.

 

All news about releases, talks, articles and anything else relevant to the project will be shared on the +Arquillian account.

 

GooglePlus 128 Red.png

 

Add Ike to your circles!

According to ohloh, Arquillian has a very large, active development team. Here's a summary of the contributor stats that ohloh curated.

Over the past twelve months, 34 developers contributed new code to Arquillian.

This is one of the largest open-source teams in the world, and is in the top 2% of all project teams on Ohloh.

For this measurement, Ohloh considered only recent changes to the code. Over the entire history of the project, 41 developers have contributed.

Thank you all for making this project so successful and fun! Arquillian has a bright future. Above all other awards and recognitions, it's the number and diversity of contributors that's the most significant. The smartest one amongst us is all of us, working together.

Cheers!

Even with the first beta still on the horizon, Arquillian has already begun to transform the enterprise testing landscape, making the formerly untestable testable.

The early influence of the Arquillian project is the result of a legion of community members integrating their diverse skills to flatten the barrier to integration testing. The collaboration across projects and across communities is truly inspiring. It's safe to say that not only is the Arquillian invasion on, it's well ahead of its release schedule. And that's awesome. And the growing community is the reason why.

Noble Ike, the Arquillian prince, and the core project team, would like to recognize the community members that have helped shape Arquillian during each release cycle, either through code contributions, participation or advocacy. For donating their time, effort and patience to make Arquillian a better testing framework for the benefit of the community, we award each of them the title Arquillian Noble.

The Arquillian Nobles page on the project site lists the recipients along with the contributions they made. Contributors are awarded for either a specific release, or for general support of the project. The names of the community members crowned so far are listed here (for reference):

  • http://design.jboss.org/arquillian/logo/ui/images/crown/arquillian_ui_crown_256px-glossy.png
  • Pete Muir
  • Cheyenne Weaver
  • Karel Piwko
  • David Allen
  • Andy Gibson
  • Jason Porter
  • Jesper Pedersen
  • Jean Deruelle
  • Thomas Diesler
  • Stale Pedersen
  • Nicklas Karlsson
  • Ken Gullaksen
  • Alejandro Montenegro
  • Adrian Cole
  • Paul Bakker
  • German Escobar
  • Michael Schuetz
  • Adam Warski
  • Markus Eisele
  • Cosmin Martinconi
  • John Ament
  • Stuart Douglas
  • Jordan Ganoff
  • Lincoln Baxter III
  • Mike Brock
Community members may be crowned for multiple releases. Once a contributor becomes a member of the core team, subsequent contributions are not called out (team members are noble by default).

In addition to being listed on the Arquillian Nobles page, we are working to get a crown added to each recipient's JBoss Community profile so that it is globally visible. We'll announce when that's available.

The more container adapters and extensions we create, the more power we put in the hands of the developer, and the better enterprise software will become. Feature transparency FTW!

Thanks to all the Arquillian Nobles, present and future, for making Arquillian awesome and for simplifying testing to child's play!

If you think doing integration testing is significantly slower, complex or just plain harder than unit testing, think again. In this video, Aslak shows how quickly you can go from an empty directory (0mph) to a project that runs a CDI test inside a managed JBoss AS 7 container (60mph) in under a minute using the Arquillian plugin for Seam Forge.

 

 

Arquillian + Seam Forge 0-60 in under a minute from Aslak Knutsen on Vimeo.

 

Notice that the test cold boots JBoss AS 7, deploys the tests and runs it in-container, then undeploys and shuts down the server in < 5 seconds. (It runs even faster when you take away the Maven cycle).

 

A quote by Brian Leathem is suitable for quoting here:

With tools like Arquillian, Shrinkwrap, [and] in-memory databases, [we] are busting through the old barriers of terms like unit and integration tests. Perhaps we need a new term for them: "real tests" or "useful tests" are two possibilities that come to mind.

 

Don't mock. Test for real.

Great news! We've drastically cut down the number of dependencies that Maven has to download in order to use the JBoss AS 6 remote container adapter Arquillian. You no longer have to download Hibernate just to connect to a remote or managed (standalone) JBoss AS instance

 

To cut to the chase, replace this dependency:

 

<dependency>
   <groupId>org.jboss.jbossas</groupId>
   <artifactId>jboss-as-client</artifactId>
   <version>6.0.0.Final</version>
   <type>pom</type>
</dependency>

 

with this one:

 

<dependency>
  <groupId>org.jboss.jbossas</groupId>
  <artifactId>jboss-as-profileservice-client</artifactId>
  <version>6.0.0.Final</version>
  <type>pom</type>
</dependency>

 

The number of dependencies drops from 318 to just 28! That should save you a heaps of time. Now, Maven doesn't have download these extra dependenices on the first run, and doesn't have to resolve the graph on subsequent invocations. You also cut out this unresolved pom warning:

 

[WARNING] The POM for ws-commons:policy:jar:1.0 is invalid, transitive dependencies
(if any) will not be available, enable debug logging for more details

 

To make a long story short, the JBoss AS team publishes a stack POM (i.e., BOM) to identify all the dependencies used in JBoss AS. The client POM is a little too well linked and ends up depending on JBoss AS itself somewhere down the line. As you can imagine, this pulls in a lot of transitive dependencies.

 

The profile service client POM is a trimmed down version that grabs only the libraries needed for communicating with a remote (standalone) JBoss AS instance using the DeploymentManager, which is accessed via the ProfileService.

 

Cut the internet a break and update your POM today

Today sets a new record for Arquillian. Arquillian is being covered in four different presentations, at four different events, in one day: Arquillian D-Day.

 

Event: Red Hat Developer Day

Speaker: Aslak Knutsen

Presentation: Arquillian

 

Event: Javaforum Stockholm

Speaker: Aslak Knutsen

Presentation: Introduction to integration testing in Java EE 6

 

Event: JBUG Belgium

Speaker: Pete Muir

Presentation: Seam 3 / Arquillian

 

Event: oredev 2010

Speaker: Adrian Cole

Presentation: Java provisioning in the cloud

 

These presentations are just the beach landing. The main event is next week, Devoxx 2010, where we'll have some big news.

 

Event: Devoxx 2010

Speaker(s): Aslak Knutsen, Dan Allen & Pete Muir

Presentation: Java enterprise testing made easy with Arquillian (3 hour lab)

 

See ya somewhere!

dan.j.allen

We're published!

Posted by dan.j.allen Oct 28, 2010

Arquillian may still be in alpha, but it's proven so useful that you can already read about it in publications! In the October 2010 issue of NFJS Magazine, I explain how Arquillian provides a component model for integration testing and why it matters to you. It's fitting that it appears in the issue titled "Control Your Destiny". Here's the abstract for the article:

 

nfjsmag-cover-oct-2010.pngArquillian: A component model for integration testing
by Dan Allen

 

You know you should test. The reasons are prevelant. Tests help you analyze your API, validate the behavior of your business logic, serve as documentation "at the source" for users and maintainers, and so on. The plan is easy to follow, at first, particularly if you're working on a greenfield application.

 

But eventually, you bump into the testing bandgap, the point at which you have to being testing components coupled to other resources, services or layers. (And you really do want to test them, not just mock them). It's at this transition, from unit to integration test, that the ever-important project deadline becomes threatened. Work stops, your browser history floods with search results, the build script multiplies and the code-build-test cycle becomes a code-build...-catch up on tweets-test cycle. Testing becomes a bore (not to mention costly). It's time for a new strategy.

 

If you dial down your social media stream for a few minutes, I'll prove to you that a component model for tests can make an integration test appear as simple as a vanilla unit test. Child's play, really. The secret agent (turned alien invader) is Arquillian, a container-oriented testing framework that enables you to write portable integration tests for enterprise Java applications and beyond. You'll discover how Arquillian's test enrichment, packaging and deployment, in conjunction with container lifecycle management, let you skip the build and test in-container, all without having to leave the comfort of your IDE (or the commandline, if it suits you). With Arquillian in hand, integration testing becomes fun and productive again.

 

Ready to play?

 

I strongly recommend supporting this tech magazine of rare quality. All the authors are NFJS tour speakers and therefore you can expect highly technical, pragmatic and entertaining articles. Visit http://bit.ly/57fCM to subscribe.

 

ejb-3.1-oreilly.pngArquillian is also in print! Walk into most Borders or Barnes and Noble stores and you can find Arquillian used in the examples of Andrew Rubinger's Enterprise JavaBeans 3.1 Sixth Edition, published by O'Reilly.

 

Although the Arquillian story is just getting started, it's already being well told.

arquillian_icon_jpa.pngA while back, Arun Gupta proposed a recipe for testing JPA 2 (JPQL & Criteria) using Embedded GlassFish in one of his notable Tips of The Day (TOTD #133). Embedded containers such as GlassFish certainly make testing Java EE APIs achievable. But I want to challenge Arun's conclusion that using Embedded GlassFish programmatically is the perfect recipe for testing.

In this entry, I'll show that the test can be further simplified. By throwing the complexity of managing the container over the wall, you can focus solely on the task at hand, testing (and experimenting with) JPA 2. Not only does the test get simpler, it also becomes portable, so you are not locked into running it on Embedded GlassFish. Any compliant Java EE container, such as JBoss AS, or even a standalone JPA runtime will do. That's a lot of flexibility.

The secret ingredient: Arquillian

As in Arun's TOTD, our test will:

  • persist entities to a database and subsequently query them using JPQL and the JPA 2 Criteria API

But that's all we'll worry about. We'll let Arquillian handle the task of creating the JDBC Connection Pool and JDBC Resource using GlassFish APIs. Even that is behavior specific to the select target container. Other target containers may have parallel operations. That's of no concern to the test.

Like Arun's application, ours uses a (video) Game entity with two fields:

  • id - the primary key
  • title - the title of the game

The test persists 3 sample entries to the database and then retrieves them using a JPQL statement and the Criteria API. The test will perform three tasks:

  • store 3 sample entities in the database using the JPA EntityManager
  • query the database using JPQL
  • query the database using Criteria API

The entire source code is available in the Arquillian examples project on github.  All you need to see the action is run "mvn test" (and a hint of patience to wait for Maven to download the dependencies).

To get you acclimated, here's the directory structure of the project.

pom.xml
src
|-- main
|   `-- java
|       `-- com
|           `-- acme
|               `-- jpa
|                   `-- Game.java
`-- test
    |-- java
    |   `-- com
    |       `-- acme
    |           `-- jpa
    |               `-- GamePersistenceTestCase.java
    |-- resources
    |   `-- arquillian.xml
    |-- resources-glassfish-embedded
    |   |-- sun-resources.xml
    |   `-- test-persistence.xml
    `-- resources-jbossas-remote
        |-- jndi.properties
        `-- test-persistence.xml

Game is the JPA entity class and test-persistence.xml provides the definition of our Persistence Unit for the test environment. We won't touch persistence.xml since that's the definition for the production environment.

Notice we have resource directories for both Embedded GlassFish and remote JBoss AS. We'll get into that later.

Here's the source of the Game entity class, as denoted by the @Entity annotation:

package com.acme.jpa;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
public class Game implements Serializable
{
   private Long id;
   private String title;

   public Game() {}

   public Game(String title)
   {
      this.title = title;
   }

   @Id @GeneratedValue
   public Long getId()
   {
      return id;
   }

   public void setId(Long id)
   {
      this.id = id;
   }

   @NotNull
   @Size(min = 3, max = 50)
   public String getTitle()
   {
      return title;
   }

   public void setTitle(String name)
   {
      this.title = name;
   }

   @Override
   public String toString()
   {
      return "Game@" + hashCode() + "[id = " + id + "; title = " + title + "]";
   }
}

The primary key is defined using the @Id annotation on the field. Additional columns are derived automatically from bean properties (standard getter/setter convention). You can use the @Column annotation to explicitly set the name of the column. Otherwise, the column name is determined by removing the "get" prefix from the bean property's read method and lowercasing the first character of the remainder (e.g., getTitle() => title).

We are also using standard Bean Validation annotations to enforce constraints. Here, a title must be provided and it must be between 3 and 50 characters long. That would make a good test.

Let's create a new JUnit 4 Arquillian test case, GamePersistenceTestCase, and prepare it to test our JPA operations. We'll leverage CDI (JSR-299) to supply us with the resources we need via dependency injection. (We'll look at an alternative way to accomplish this using a utility EJB in a follow-up post).

@RunWith(Arquillian.class)
public class GamePersistenceTestCase
{
   @Deployment
   public static Archive<?> createDeployment()
   {
      return ShrinkWrap.create(WebArchive.class, "test.war")
            .addPackage(Game.class.getPackage())
            .addManifestResource("test-persistence.xml", "persistence.xml")
            .addWebResource(EmptyAsset.INSTANCE, "beans.xml");
   }

   private static final String[] GAME_TITLES =
   {
      "Super Mario Brothers",
      "Mario Kart",
      "F-Zero"
   };
   
   @PersistenceContext
   EntityManager em;
   
   @Inject
   UserTransaction utx;

   // tests go here
}

Let's work from top to bottom to understand what's going on here before we get to the tests.

@RunWith(Arquillian.class)
Tells JUnit to delegate execution of the test to the Arquillian runner.  This allows Arquillian to infuse your test with a component model, which consists of container lifecycle management and dependency injection, among other enhancements. Notice that you are not required to extend a base class, so that's left open to your own design.
@Deployment method
Produces a "micro deployment" archive using the ShrinkWrap API.  Arquillian deploys this archive, along with the test case and some additional infrastructure, to the container. The test then executes as a component within this mini application. The contents of this archive are the tests isolated little world.
GAME_TITLES constant
The sample test data
@PersistenceContext EntityManager
Injects the persistence context (EntityManager) directly into the test, just as though the test were a managed bean.
@Inject UserTransaction
Injects a JTA transaction directly into the test, a service provided to the managed bean by CDI (JSR-299).

Let's add a helper method that enters the sample records into the database:

public void insertSampleRecords() throws Exception
{
   // clear database
   utx.begin();
   em.joinTransaction();

   System.out.println("Clearing the database...");
   em.createQuery("delete from Game").executeUpdate();

   // insert records
   System.out.println("Inserting records...");
   for (String title : GAME_TITLES)
   {
      Game game = new Game(title);
      em.persist(game);
   }

   utx.commit();
}

We have to explicitly enlist the EntityManager in the JTA transaction since we are using these two resources independently. Normally enlistment happens automatically within an EJB.

Here's the test that verifies we can select the sample records using JPQL.  We'll print some logging statements so you can watch what's going on.

@Test
public void should_be_able_to_select_games_using_jpql() throws Exception
{
   insertSampleRecords();

   utx.begin();
   em.joinTransaction();

   System.out.println("Selecting (using JPQL)...");
   List<Game> games = em.createQuery("select g from Game g order by g.id",
      Game.class).getResultList();
   System.out.println("Found " + games.size() + " games (using JPQL)");
   assertEquals(GAME_TITLES.length, games.size());

   for (int i = 0; i < GAME_TITLES.length; i++) {
      assertEquals(GAME_TITLES[i], games.get(i).getTitle());
      System.out.println(games.get(i));
   }

   utx.commit();
}

Now for the new stuff! Here's the same test that uses the Criteria API. Note that this test depends on the JPA 2 annotation processor generating the Game_ metamodel class during the build compilation step.

@Test
public void should_be_able_to_select_games_using_criteria_api() throws Exception
{
   insertSampleRecords();

   utx.begin();
   em.joinTransaction();

   CriteriaBuilder builder = em.getCriteriaBuilder();
   CriteriaQuery<Game> criteria = builder.createQuery(Game.class);
   // FROM clause
   Root<Game> game = criteria.from(Game.class);
   // SELECT clause
   criteria.select(game);
   // ORDER BY clause
   criteria.orderBy(builder.asc(game.get(Game_.id)));
   // No WHERE clause, select all

   System.out.println("Selecting (using Criteria)...");
   List<Game> games = em.createQuery(criteria).getResultList();
   System.out.println("Found " + games.size() + " games (using Criteria)");
   assertEquals(GAME_TITLES.length, games.size());

   for (int i = 0; i < GAME_TITLES.length; i++) {
      assertEquals(GAME_TITLES[i], games.get(i).getTitle());
      System.out.println(games.get(i));
   }

   utx.commit();
}

In order for JPA to work, it needs a Persistence Unit. We define the Persistence Unit in the test-persistence.xml that's associated with the target container.

ShrinkWrap takes this file from the classpath and puts it into its standard location within the archive.

.addManifestResource("test-persistence.xml", "persistence.xml")

Here's the entire structure of the archive ShrinkWrap will assemble for this test case (minus the Arquillian infrastructure):

WEB-INF/
|-- beans.xml
|-- classes
|   |-- META-INF
|   |   `-- persistence.xml
|   `-- com
|       `-- acme
|           `-- jpa
|               |-- Game.class
|               |-- GamePersistenceTestCase.class
|               `-- Game_.class
`-- lib
    |-- ...

Let's look at the Persistence Unit descriptor for Embedded GlassFish (src/test/resources-glassfish-embedded/test-persistence.xml).

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
      http://java.sun.com/xml/ns/persistence
      http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
   <persistence-unit name="test">
      <jta-data-source>jdbc/arquillian</jta-data-source>
      <properties>
         <property name="eclipselink.ddl-generation"
            value="drop-and-create-tables"/>
         <property name="eclipselink.logging.level" value="FINE"/>
      </properties>
   </persistence-unit>
</persistence>

We set two vendor-specific properties to activate features of the built-in provider, EclipseLink. The first property tells EclipseLink to generate the database to match the JPA entities. The second property enables logging of SQL statements so we can monitor the activity.

The Persistence Unit is referring to the JTA DataSource named jdbc/arquillian.  Where's that defined? Ah, that's something the Arquillian container adapter needs to setup. As in Arun's recipe, we want to use the GlassFish APIs to create a JDBC Connection Pool and associated Resource. But we don't want to have to code it. We just want to declare it.

First, we create a sun-resources.xml file (src/test/resources-glassfish-embedded/sun-resources.xml) containing the resource definitions, which GlassFish knows how to consume.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC
   "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN"
   "http://www.sun.com/software/appserver/dtds/sun-resources_1_4.dtd">
<resources>
   <jdbc-resource pool-name="ArquillianEmbeddedDerbyPool"
      jndi-name="jdbc/arquillian"/>
   <jdbc-connection-pool name="ArquillianEmbeddedDerbyPool"
      res-type="javax.sql.DataSource"
      datasource-classname="org.apache.derby.jdbc.EmbeddedDataSource"
      is-isolation-level-guaranteed="false">
      <property name="databaseName" value="target/databases/derby"/>
      <property name="createDatabase" value="create"/>
   </jdbc-connection-pool>
</resources>

We've now isolated the DataSource definition from the test in the same way we do in the main application. The further benefit is that we can define any resources we might need for our test. Imagine the possibilities.

Now we need to tell Arquillian to use this file. We open up the Arquillian configuration (src/test/resources/arquillian.xml) and configure the Embedded GlassFish container adapter to pick up this file, which it will feed to the asadmin add-resources command.

<?xml version="1.0" encoding="UTF-8"?>
<arquillian xmlns="http://jboss.com/arquillian"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:gfembed="urn:arq:org.jboss.arquillian.container.glassfish.embedded_3">
   <gfembed:container>
      <gfembed:sunResourcesXml>
         src/test/resources-glassfish-embedded/sun-resources.xml
      </gfembed:sunResourcesXml>
   </gfembed:container>
</arquillian>

All that's left is to setup the Maven build to execute the test. To get this code to actually compile, we have to tell Maven it's okay to use JDK 6 (it's stubborn like that).

<build>
   <plugins>
      <plugin>
         <artifactId>maven-compiler-plugin</artifactId>
         <version>2.3.1</version>
         <configuration>
            <source>1.6</source>
            <target>1.6</target>
         </configuration>
      </plugin>
   </plugins>
</build>

You also need to configure Maven to run the JPA 2 annotation processor, which I describe in another blog entry.

We're going to separate out the target containers using Maven profiles. All of the profiles will share a common set of dependencies:

<dependencies>
   <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.8.1</version>
   </dependency>

   <dependency>
      <groupId>org.jboss.arquillian</groupId>
      <artifactId>arquillian-junit</artifactId>
      <version>1.0.0.Alpha4</version>
   </dependency>
</dependencies>

Here's the profile for Embedded GlassFish. If you don't want to target multiple containers, you can simply make this part of the top-level configuration.

<profile>
   <id>arq-glassfish-embedded</id>
   <activation>
      <activeByDefault>true</activeByDefault>
   </activation>
   <dependencies>
      <dependency>
         <groupId>org.jboss.arquillian.container</groupId>
         <artifactId>arquillian-glassfish-embedded-3</artifactId>
         <version>1.0.0.Alpha4</version>
      </dependency>
      <dependency>
         <groupId>org.glassfish.extras</groupId>
         <artifactId>glassfish-embedded-all</artifactId>
         <version>3.0.1</version>
      </dependency>
   </dependencies>
   <build>
      <testResources>
         <testResource>
            <directory>src/test/resources</directory>
         </testResource>
         <testResource>
            <directory>src/test/resources-glassfish-embedded</directory>
         </testResource>
      </testResources>
   </build>
</profile>

We are explicitly adding the src/test/resources-glassfish-embedded directory as a test resource directory so that test-persistence.xml is placed into the classpath. Again, if you only intend on using Embedded GlassFish, this file can be moved into the standard Maven location and you can skip this configuration.

When you are done setting everything up, you can run the test with the following command:

$> mvn clean test

The profile for Embedded GlassFish is activated by default. Snippets of the test output is show below.

...
INFO: GlassFish Server Open Source Edition 3.0.1 (java_re-private)
 ...
Oct 4, 2010 1:01:56 PM org.jboss.arquillian.container.glassfish.embedded_3.GlassFishEmbeddedContainer executeCommand
INFO: add-resources command result (1): JDBC connection pool ArquillianEmbeddedDerbyPool created successfully.
Oct 4, 2010 1:01:56 PM org.jboss.arquillian.container.glassfish.embedded_3.GlassFishEmbeddedContainer executeCommand
INFO: add-resources command result (2): JDBC resource jdbc/arquillian created successfully.
Oct 4, 2010 1:01:56 PM com.sun.enterprise.v3.services.impl.GrizzlyProxy$2$1 onReady
INFO: Grizzly Framework 1.9.18-o started in: 226ms listening on port 8181
 ...
Oct 4, 2010 1:07:14 PM com.sun.enterprise.web.WebApplication start
INFO: Loading application test at /test
 ...
Inserting records...
Selecting (using JPQL)...
Found 3 games (using JPQL)
Game@22609264[id = 1; title = Super Mario Brothers]
Game@3655662[id = 2; title = Mario Kart]
Game@20289248[id = 3; title = F-Zero]
Selecting (using Criteria)...
Found 3 games (using Criteria)
Game@25589884[id = 1; title = Super Mario Brothers]
Game@18616220[id = 2; title = Mario Kart]
Game@29940830[id = 3; title = F-Zero]
 ...
Oct 4, 2010 1:07:16 PM com.sun.enterprise.v3.server.AppServerStartup stop
INFO: Shutdown procedure finished

That's a real integration test.

What's more, we can run the exact same test on JBoss AS. We'll need a different Persistence Unit definition that specifies a JDBC Resource available on JBoss AS and sets some Hibernate configuration settings. (Arquillian doesn't yet support deploying a DataSource to JBoss AS--though it's in the pipeline--so for now we use the built-in DataSource, java:/DefaultDS.).

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
      http://java.sun.com/xml/ns/persistence
      http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
   <persistence-unit name="test">
      <jta-data-source>java:/DefaultDS</jta-data-source>
      <properties>
         <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
         <property name="hibernate.show_sql" value="true"/>
      </properties>
   </persistence-unit>
</persistence>

Then we need a Maven profile that adds the JBoss AS container adapter and client API libraries and the JBoss AS resources:

<profile>
   <id>arq-jbossas-managed</id>
   <dependencies>
      <dependency>
         <groupId>org.jboss.arquillian.container</groupId>
         <artifactId>arquillian-jbossas-managed-6</artifactId>
         <version>1.0.0.Alpha4</version>
      </dependency>
      <dependency>
         <groupId>org.jboss.jbossas</groupId>
         <artifactId>jboss-as-client</artifactId>
         <version>6.0.0.20100721-M4</version>
         <type>pom</type>
         <scope>provided</scope>
      </dependency>
      <dependency>
         <groupId>org.jboss.spec</groupId>
         <artifactId>jboss-javaee-6.0</artifactId>
         <version>1.0.0.Beta7</version>
         <type>pom</type>
         <scope>provided</scope>
      </dependency>
      <dependency>
         <groupId>org.jboss.jbossas</groupId>
         <artifactId>jboss-server-manager</artifactId>
         <version>1.0.3.GA</version>
         <scope>test</scope>
      </dependency>
   </dependencies>
   <build>
      <testResources>
         <testResource>
            <directory>src/test/resources</directory>
         </testResource>
         <testResource>
            <directory>src/test/resources-jbossas-remote</directory>
         </testResource>
      </testResources>
   </build>
</profile>

Now we run the test again using Maven, but this time activate the JBoss AS managed profile. (You need to set the JBOSS_HOME environment variable to point to a JBoss AS installation)

$> mvn clean test -Parq-jbossas-managed

Here's the kicker. You can run this test into your IDE! Just import the project, open the test case and select "Run As > JUnit Test". Voila! It works just like any other JUnit test.

Enjoy the perfect recipe for testing JPA!

While it may have seemed like a lot of preparation, recognize that we left no stone unturned. To remind you of the benefits, just look back at how simple the test case is. And remind yourself it's not bound to any particular Java EE 6 container or JPA 2 implementation.

Stay tuned for other combinations, such as OpenEJB 3.2 Embedded with OpenJPA 2. So far I've figured out how to test JPA 1.x applications using OpenEJB 3.1 with OpenJPA, Hibernate and EclipseLink.

Why deal with complexity? Throw it over the wall! Let ShrinkWrap and Arquillian handle it.

That's the message Andrew Rubinger (ALR) and I took to JavaOne 2010. We lived it too, keeping a constant stream of discussion going about how to reduce the complexity of integration testing. Then, we bundled up all that mental complexity and threw it over the Pacific Coast during our bike ride to the Cliff House and over the Golden Gate Bay Bridge.

alr-and-dan-cover-scaled.jpg

The first morning, I woke up (after several attempts) in a panic because I thought I missed my first JBoss booth mini-session. I even sent an e-mail to the booth coordinator apologizing for running out of steam and not being able to make it. As it turns out, my calendar was playing musical time zones on me and the talk wasn't for another three hours. Saved. In part.

ejb-book-scaled2.jpgAfter two hours of hacking up slides, ALR and I bolted out of the hotel and across the street to the Hilton, where he proceeded to guide me through the labyrinth that housed the partner pavilion. On our way through, we had an accidental encounter with the JavaOne bookstore, so we stopped in to see ALR's EJB 3.1 book in print.

He flipped it over to show me my quote on the back.

ejb-quote-border.png

After our pitstop, we zigzagged our way to the partner pavilion entrance just minutes before my talk would start. The pavilion bouncer barked "Show your passes." I tried to tell her that I hadn't had a chance to pick it up yet and I was presenting in 5 minutes. She didn't want to hear it. She waved her radio like it were a gun, as if she were guarding the entrance to a sheik's lair. "No pass, no access." Round three.

I reentered the labyrinth to find the registration desk. There, I got knighted an official speaker and retraced my steps to the partner pavilion. I got plugged in, wired up and was on camera in under a minute to give my Seam: State of the Union address.

And that's how JavaOne began for me.

As soon as I tore down, ALR was geared up, ready to show booth passersby how to achieve rapid enterprise development by throwing test complexity over the wall. This would be one of two warm-up sessions for our main event at JavaOne.

alr-booth-talk-scaled.jpg

Once I had a chance to step back and look at the booth, I realized there was a surprise waiting for me. Arquillian has a spot on the booth wall.

arquillian-booth-wall-scaled.jpg

It also had a seat front and center in the info stand.

arquillian-info-stand.jpg

Clearly we are making some progress getting our message across. And we're just getting started.

We hung out at the booth the rest of the day, continuing to talk to conference goers about Arquillian and other geek talk. We were excited to here that Arquillian got mentioned in at least one other talk at JavaOne. Reza Rahman and Debu Panda, co-authors of EJB in Action, presented their talk "Testing Java EE 6 Applications: Tools and Techniques" in front of a full house, in which they cited Arquillian as:

An ideal cross-vendor CDI/EJB 3.1 testing tool

You can check out the slides for that talk or browse the demo source code.

I also had a long conversation with Hans and Adam of the Gradle team. I love those guys, and their passion for pragmatic build automation.

That night we decided to have a JBoss dinner at The House of Prime Rib on a recommendation from Jay Balunas, who saw the restaurant featured on the food network. To that, I replied, "You had me at steak." But we had to earn it. Being the athletic, eager type, ALR and I walked 20 blocks, mostly uphill, to the restaurant.

That turned out to be the fasted meal of perfection I've ever had because I still had to make the CDI BOF at the Moscone Center. I walked in 1 minute late to the greeting "So glad you could show up!"

license_asl-on.pngThe CDI BOF went great. I highlighted our commitment to freeing Java standards by putting the CDI TCK and RI (Weld) under the Apache License. I also explained how Arquillian was born out of the TCK and how important it will be to enabling rapid development with Java EE, or at the very least make it easily testable.

I followed David Blevins and Adam Bien to the Thirsty Bear, my only appearance there for the week. (There were very few session in Moscone, so Thirsty Bear was mostly neglected). I got a chance to chat 1-on-1 with Adam Bien, making sure to extend a personal invitation to check out Arquillian. I also enjoyed his many development horror stories.

The story I liked the best was about the architect who wouldn't let him deploy a JSF application that used Facelets without pre-compiling the JSPs. Adam tried to explain that there were no JSPs to pre-compile, but it was wasted breath. So he just added a token JSP and the issue was settled. He cracks me up.

The next day seemed to go quickly. I gave my first JavaOne presentation, CDI, Weld and the future of Seam to a full room. The most important part. I finished on time. Thank goodness.

javaone2010_welcome_poster-scaled3.jpgThat night, we launched our party into the cloud at the JBoss gathering. It was hosted at the historic "Slide" adjacent to Union Square. During Prohibition, the site was called "The Cable Car Theater" and below was a "restaurant" called "Cafe Dans" - but Cafe Dans was not a restaurant. It was a speakeasy that could be accessed only by a savvy few who pushed a secret wall that lead to a playground slide, and a hidden subculture of nightlife. Lot's of community members found the secret door...so it wasn't that secret after all.

What else would you expect from those rebellious JBoss characters? Survey said, "Just like the awesome JBoss parties of old." Glad to see us returning to their roots in an uncertain time.

The next day, ALR and I were back at the booth again, me speaking about Seam and ALR throwing more complexity over the booth wall. Then, we went back to the room to prepare Ike for his JavaOne debut. Throwing complexity over the wall: Rapid development for enterprise Java. Slides, check. Demo, check. This was it.

We got in the room, same routine. After fiddling with displays, workspaces and mics, we looked up to see standing room only attendance. Sweet. It's on. Back and forth ALR and I went chopping down complexity one slide at a time. The demos mostly cooperated. The applause at the end, huge. Lots of interest, lots of excitement. All in a days work

Next up was the JCP awards ceremony. Summary, we didn't win. Moving on.

Everyone was headed over to Treasure Island for the blockbuster concert that was going on there. In the registration rush, I managed to not get issued a ticket. But, thanks to Matthias & friends, I got a "community edition" pass. When we arrived, we learned just how much colorful light a stadium size LED puts out.

big-led-screen-scaled.jpg

A conference, or a festival?

will-i-am-dj-scaled3.jpgWe watched Fergie Pump It and will.i.am spin the old tunes atop a pillar of King Ellison during the Black Eyed Peas performance. We tried to squeeze our way somewhere near the stage. Not a chance. The place was chock full of geeks and plenty of tag-alongs.

In a crowd of nearly 25,000, one guy tapped me on the shoulder and said,

Arquillian looks really cool. I'll have to check it out. You said you'd demo it in a bar. How about at at concert?

What a character! I would have done it too, except I checked my bag.

Our group hung around for Steve Miller, who brought funk, blues, classics and an overall killer performance.

steve-miller-scaled.jpg

We tried to sneak back into downtown for last call, but we were too late. But when I got back to the hotel, ALR greeted me with a bottle of Johnny Walker, Black Label. Hero.

bike-ride-start-scaled3.jpgTech weary, ALR and I decided to skip the last day and instead headed out to bike the Golden Gate Bridge. I was snapping pics with my phone the whole time, despite not having been on a bike in years. I'm crazy like that.

On the recommendation of ALR's friend, we took a detour to Ocean Beach...

ocean-beach-scaled4.jpg

then up to the famous Cliff House for some desperately needed lunch (and for me, breakfast).

cliff-house-alr-dan-scaled.jpg

Despite popular belief, developers do stop to smell the roses occasionally.

roses-scaled.jpg

But we have to be manly too. So we took a peak at an overlook with views of "The Rock" and tried to look really large and in charge for our cover picture.

panoramic-rock-scaled-horizon.jpg

Then it was off to to the bridge, at last. We somehow managed to find the right path, despite vague instructions from the guy at the bike store to "follow the service road to the bridge". Yeah, more like dirt path with random staircases.

golden-gate-serpentine-rock-scaled2.jpggolden-gate-bridge-scaled2.jpg
to-golden-gate-bridge-scaled2.jpgover-bridge-scaled2.jpg

We didn't want to miss the last night out on the town, so we hoped the ferry back from Sausalito and caught the sunset on the way into harbor.

sunset-scaled.jpg

We had one last covert meeting with colleagues in a basement sushi restaurant (aren't those the best kind) about standards and leadership. We then bid farewell. After more than two weeks on the road, I was headed home at last! On the flight home I wrote the lyrics for the Hudson Blues and implemented a Spring container for Arquillian. Crankin' it out.

cliff-house-alr-scaled.jpg

The next time you are writing integration tests for your enterprise Java application, take advice from ALR:

Throw complexity over the wall and lean on Arquillian and ShrinkWrap.

Hudson's down, and it's singin' the blues!

 

To the tune of Everything Is Broken by Bob Dylan.

 

everything-is-broken.png

Hudson blues

 

Broken methods, broken tests
Broken threads, broken specs
Broken asserts, broken source
QA rantin' until they're hoarse
Ain't no use patchin'
Ain't no use mergin'
Every test is broken

 

Broken pages, broken files
Broken urls, broken compiles
Broken markup, broken tags
Hudson's filled with broken builds

 

Broken apps never meant to be tested
Every test is broken

 

Seem like every time you stop and turn around
Another failure report gets emailed out

 

Broken proxies, broken beans
Broken runtimes, broken teams
Broken archives, broken lifecycles
Broken deployments on broken servers

 

Take a deep breath, deal with the crashin'
Every test is broken

 

Everytime you leave and go off someplace
The app falls to pieces in my face

 

Broken hands on broken keyboards
Broken IDEs with broken classes
Broken pipes, broken tools
People bending broken rules
JUnit howling, surefire croakin'
Every test is broken

 

Fix those tests with Arquillian!

The JBoss Developer Webinar Series continues on Aug 18th with a talk by alrubinger and aslak on Enterprise Testing with Arquillian. Don't miss this chance to learn how Arquillian can reduce your enterprise testing tasks to child's play, all without leaving the comfort of your IDE!

 

Registration


https://inquiries.redhat.com/go/redhat/20100818EnterpriseTestingviaArquillian


Webinar Description

 

You know you should test. You know that testing forces you to consider API design. That it proves your implementation, and that it documents for other maintainers its use. That it future-proofs you during refactoring but with too many moving parts, it's hard to fault even the most savvy developer for giving up. Tests have been slow to write, slow to execute, and push back our deadlines.
It doesn't have to be that way anymore.

 

In this session, we'll explore techniques to skip the build and stay within the IDE, reduce boilerplate by harnessing an annotation-driven framework, and hook into some common embeddable EE containers from a plain JavaSE environment.

Replays will be available on the Webinar Series page shortly after the talk. Join us afterwards in the #jbosstesting channel on Freenode IRC for follow-up questions.

Last month, the Arquillian developers got together at Red Hat Summit / JBoss World 2010, hosted at the Seaport World Trade Center in Boston, to Experience Open Source with our community.

 

conference-entrance.jpg

 

We Community Track Nominations what they wanted to hear about at JUDCon. The survey said, "Arquillian." So we unleashed Ike and his fleet of testable containers onto JUDCon and JBoss World.

 

While Arquillian only appeared twice on the official schedule–once at JUDCon, presented by Aslak and myself, and once at JBoss World, presented by ALR–it managed to make an appearance every hour, in one form or another (including bar discussions). Thanks for encouraging him with all the votes!

 

On the eve of JUDCon, three of the Arquillian ringleaders (aslak, alrubinger and dan.j.allen) met up at Harvard Square bar for the Boston JBUG to devise a plan to make testing a main focal point of the weeklong conference event:

 

arquillian-ringleader-meeting.jpg

 

Not letting a moment slip by, Arquillian led off the community track at JUDCon early the next morning.

 

judcon-community-track.jpg

 

Aslak and I wanted to leave a strong impression on the audience. So instead of going on about theory, we prepared a talk on the future of Java EE testing that can be summed up as: demo, demo, demo, demo. With me driving the commands, Aslak pointed at the screen and, in a flash, showed how Arquillian can make child's play out of testing EJBs, JMS, JAX-RS, JPA and even JSF.

 

aslak-presenting-arquillian-test.jpg

 

While we've come a long way with Arquillian, presenting always gets us thinking of other things we can do with it. (Notice Aslak sporting the black Arquillian shirt).

 

aslak-pondering-question.jpg

 

Ike didn't want to get stuck inside the computer the whole conference, so we printed him on a bunch of shirts and buttons to give away. Our plan was almost foiled because of my absentmindedness, but it was saved when my wife delivered the "bag of goodies" just as the talk was ending. We spread the Arquillian swag around and it scattered off to invade other talks and strike up conversations.

 

dan-tossing-t-shirts.jpg

 

Everytime you turned around, Ike was hitching a ride on someone's backpack.

 

arquillian-riding-on-backpack.jpg

 

Making his second apparence on the JBoss Community Asylum, this time under the JBoss moniker, Aslak explained how Arquillian makes the task of testing Java EE applications simple and possible. This would be one of many trips to the microphone throughout the week. But this time, he caught some grief from the jokester hosts poking fun at the project name:

 

Who is Hark William? Is he a country singer or some sort of character from Star Wars?

 

Aslak set the record straight.

 

His name is Ike. And he's from Hollywood. He's an alien that controls everything inside his little world.

 

http://labs.jboss.com/files/jbosslabs/design/arquillian/logo/final/arquillian_icon_64px.png

 

If Ike could speak, he would have simply issued the warning:

 

Don't mock me.

 

He must have left quite an impression, because the host immediately credited Arquillian as having "a couple of talks today." Sure, that's how we remember it too

 

Even though the Arquillian team only had one talk at JUDCon, we did have a front row seat in the Code generation world premiere presented by jesper.pedersen from the JBoss JCA Team, showing of their shiny new tool for JCA adaptor source code generation with full Arquillian test support.

 

So what's the Arquillian project status? "Alpha3 is coming soon. And more containers." (Little did they know, three containers would be added later that night).

 

The podcast had interrupted the JUDCon hackfest. It then proceeded to ultimately disrupt the hackfest when Emmanuel announced at the top of the hour,

 

Let's go get some beers.

 

So all the talk of a hackfest ended up being just that, talk. But wait, not those hard-core Arquillian developers. They're the only ones that stuck around, pressing on even in the absense of beer.

 

arquillian-hackfest.jpg

 

"Why?" you ask. Because we were hell-bent on getting the Tomcat and Jetty container integrations working. I did the Jetty integration while deruelle_jean worked on the one for Tomcat. lincolnthree looked on.

 

arquillian-hackfest-intense.jpg

 

Once we both got green bars, we finally called it a night and headed out for a round of drinks to celebrate.

 

drinking-at-whiskey-priest.jpg

 

We took a break the next afternoon to check out the sights and sounds of downtown Boston, which could be seen off in the distance from the conference center.

 

downtown-boston.jpg

 

That evening I headed over to the Red Hat Summit kickoff at the pavilion for my booth duty. kenglxn, one of our top community members, snapped a shot of me sporting our cool Arquillian desktop wallpaper on my Android phone.

 

arquillian-android-background.jpg

 

Fashioning the Arquillian button, I was soon approached by an attendee who asked me if I had any extra. I asked him if he knew what they were for. He replied,

 

No. But it looks really cool.

 

Ike, such a developer magnet

 

At some point we made our way from the conference center to a bar downtown. Like always, I'm in the bar ranting on about some technology, probably Maven:

 

dan-ranting-at-bar.jpg

 

We were up early the next morning for the second Arquillian charge. ALR kicked off the conference by showing how developers can achieve rapid development with Enterprise Java by throwing complexity over the wall and using ShrinkWrap and Arquillian, while at the same time marklittle, our CTO, was in the other room explaining how Arquillian fits into our strategy in his JBoss State of the Union address.

 

Arquillian is central to the evolution of platfoms & relevant for development.

 

To put it more bluntly, he slipped out,

 

You need to test the hell out of things.

 

We agree.

 

Handling all that complexity for the developer is hard work, though. It really took it's toll on ALR,

 

alr-passed-out.jpg

 

Arquillian got a mention in the joint RichFaces 4 / Seam Faces talk and the Seam 3: State of Union talk. All the activity had the developers' interest piqued. When pmuir asked during the the JBoss Developer Story BOF what people wanted to hear more about, someone called out,

 

I want to hear more about the testing tool.

 

Once again, Aslak was called to the mic to showcase Arquillian. The timing was excellent because burrsutter, who is currently focused on improving the developer experience, witnessed first-hand how desperately this tool is needed. Afterwards, I said to him,

 

It's like we just showed up with food to a starving country.

 

And what are they asking for? More.

 

Until we meet up again, we'll be hard at work making testing as easy and powerful as possible. That means working closely with our tools guy, maxandersen (left).

 

max-aslak-alr.jpg

 

Ike sure had a big week. So at the end of it all, we bought him a drink.

 

arquillian-drink.jpg

 

The Arquillian are really heating up! Community participation is what makes the success of Arquillian possible. Keep it up folks!

 

Conference photos | More conference photos | Arquillian swag

Tomorrow is going to be an eventful day for Arquillian. Aslak and I will kick the day off with a presentation demo of Arquillian at JUDCon. Aslak will walk you through what Arquilian is doing while I drive the screen. We're planning to capture a screencast of the presentation (keep your fingers crossed). We'll also have more shirts to give away. Ike is on the back, and he has a message for you.

 

 

If you're at JUDCon, be sure to stick around for the JUDCon hackfest in the evening to hack on Arquillian with the project developers (Aslak, ALR, Pete, myself and more) from 7:30PM to 2AM EST. Other projects joining the hackfest include ShrinkWrap, Seam, JBoss AS and JBoss Cloud. The ideas are sure to be flowing!

 

If you're unable to make the trip to Boston for JUDCon, you don't have to miss out! We'll be on freenode IRC in #jbosstesting, #seam-dev and other channels throughout the hackfest. There will also be forum and JIRA activity throughout, no doubt, and Skype is another option. So this is both global event and local event!

 

Grab your code. It's on.

When you think of aliens, images of little green men likely come to mind. Following suit, the Arquillian logo and project colors are also shades green. But did you know that Arquillian is "green" as in the environment?

 

For World environment day (June 5th), Red Hat organized worldwide office events. At the Brno office, jharting and mgencur recreated the Arquillian logo out of plastic bottle caps.

 

Arquillian bottle caps logo

 

How cool is that? Where will the Arquillian logo show up next? Perhaps on the side of a bus? The invasion continues!

Testing Java EE should be easy. This summer we're going to show you how.

 

After all, you know you should test. You know it forces you to consider API design, proves your implementation, documents your code and ensures stability during refactoring. And it seems so easy when you are writing basic unit tests. When call graphs branch, you just plug in mock objects.

 

But unit tests and mocks can only take you so far. Eventually, you need to test your components in the real world. You know, integration and functional tests. But with so much to setup, it's hard to fault even the most persistent developer for giving up. Real world tests are slow to write, slow to execute and push back that ever important deadline.

 

It's time to change that perception.

 

Members of the Arquillian project will be making more than a half dozen stops this summer to show developers how to throw complexity over the wall and create enterprise tests with ease--with some talks already on the books.

 

You'll discover how to skip the build and test in-container, all without having to leave the comfort of your IDE. We'll present an annotation-driven test harness that reduces boilerplate infrastructure code and hooks into common embedded and remote EE containers from a "pojo" environment.

 

Below is a list of the talks, dates and conference events where Arquillian will land to terminate once and for all those elaborate test assemblies.

 

TalkPresenter(s)DateConference/Event
Real World Java EE Testing (slides)pmuirMay 8, 2010JBoss in Bossa
Real Java EE Testing with Arquillian

aslak

dan.j.allen

Jun 3, 2010Jazoon
The Future of Java EE Testing

aslak

dan.j.allen

Jun 21, 2010JUDCon
Throwing Complexity over the Wall:
Rapid Development for Enterprise Java
alrubingerJun 23, 2010JBossWorld
Real Java EE Testing with Arquillian and ShrinkWrap (recording)dan.j.allenAug 13-15, 2010No Fluff Just Stuff
Arquillian Invasion:
Reducing Enterprise Testing to Child's Play

alrubinger

aslak

Aug 18, 2010JBoss Community:
Webinar #6
Throwing Complexity over the Wall:
Rapid Development for Enterprise Java

alrubinger

dan.j.allen

Sep 19-23, 2010JavaOne

 

Writing a test for a real business object should not create pause. You should be able to tackle an integration test with the same confidence you have when writing a unit test for a calculator class. We're hitting the road to show you how Arquillian and ShrinkWrap provide that experience.

Filter Blog

By date:
By tag: