Combine Maven, Jetty and Selenium to automate your cross browser testing at build time. The approach I have taken is to start Jetty and Selenium in the Maven pre-integration test phase. You also need to tell Maven what to run as integration tests (I use the convention of classes ending in *IT). Here is an exert from the plugins section of my POM:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.9</version>
<configuration>
</configuration>
<executions>
<execution>
<id>integration-tests</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<skip>false</skip>
<excludes>
<exclude>none</exclude>
</excludes>
<includes>
<include>**/*IT.java
</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.26</version>
<configuration>
<scanIntervalSeconds>5</scanIntervalSeconds>
<stopPort>7966</stopPort>
<stopKey>foo</stopKey>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>7080</port>
<maxIdleTime>60000</maxIdleTime>
</connector>
</connectors>
</configuration>
<executions>
<execution>
<id>start-jetty</id>
<phase>pre-integration-test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<daemon>true</daemon>
</configuration>
</execution>
<execution>
<id>stop-jetty</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>selenium-maven-plugin</artifactId>
<version>2.0</version>
<executions>
<execution>
<id>start</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start-server</goal>
</goals>
<configuration>
<background>true</background>
<logOutput>true</logOutput>
<multiWindow>true</multiWindow>
</configuration>
</execution>
<execution>
<id>stop</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop-server</goal>
</goals>
</execution>
</executions>
</plugin>
Cross browser testing is then easy to implement. You just run individual tests that use the vaious Selenium browser start commands. Here is an example from a JUnit 4 test:
/**
* Test Firefox.
*/
@Test
public void testFirefox() {
final DefaultSelenium seleniumFF =
new DefaultSelenium(HOST, SELENIUM_PORT,
"*firefox", URL);
seleniumFF.start();
seleniumFF.open(PATH);
assertTrue("FF: recent lyrics not shown",
seleniumFF.isTextPresent(SEARCH_TEXT));
seleniumFF.close();
seleniumFF.stop();
}
/**
* Test IE.
*/
@Test
public void testIE() {
final DefaultSelenium seleniumIE =
new DefaultSelenium(HOST, SELENIUM_PORT,
"*iexploreproxy", URL);
seleniumIE.start();
seleniumIE.open(PATH);
assertTrue("IE: recent lyrics not shown",
seleniumIE.isTextPresent(SEARCH_TEXT));
seleniumIE.close();
seleniumIE.stop();
}
