Arquillian Extension
Persistence
・Database seeding using DBUnit(XML, XLS, YAML, JSON)/SQL scripts
@Test
@UsingDataSet("datasets/users.yml")
@ShouldMatchDataSet("datasets/expected-users.yml")
public void shouldXxx() throws Exception {
// given
final String expectedPassword = "...";
final User user = em.find(User.class, 2L);
// when
user.setPassword(expectedPassword);
em.merge(user);
// then
assertThat(user.getPassword(), is(expectedPassword));
}
Drone
・Integrates WebDriver
・Compatible with WebDriver(Selenium 2), Selenium 1 and Selenium Grids
@Deployment(testable = false)
public static WebArchive createArchive() {
...
}
@ArquillianResource
URL contextPath;
@Drone
WebDriver browser;
@Test
public void shouldXxx() {
browser.findElement(By.id("xxx")).click();
...
}
Graphene
・Extension for WebDriver
・PageObjects & PageFragments
・Ajax support
@Drone
WebDriver browser;
@Page
HomePage homePage;
@Test(expects = XxxException.class)
public void shouldXxx() {
homePage.login(...);
}
Warp
・Client-side request
・Support for JSF, JAX-RS, Spring MVC
import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.drone.api.annotation.Drone;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.arquillian.warp.Activity;
import org.jboss.arquillian.warp.Inspection;
import org.jboss.arquillian.warp.Warp;
import org.jboss.arquillian.warp.WarpTest;
import org.jboss.arquillian.warp.servlet.AfterServlet;
import org.jboss.arquillian.warp.servlet.BeforeServlet;
import org.jboss.shrinkwrap.api.asset.Asset;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.descriptor.api.Descriptors;
import org.jboss.shrinkwrap.descriptor.api.webapp30.WebAppDescriptor;
import org.jboss.shrinkwrap.descriptor.api.webcommon30.WebAppVersionType;
import org.openqa.selenium.WebDriver;
@RunWith(Arquillian.class)
@WarpTest
@RunAsClient
public class WebFilterTest {
@ArquillianResource
private URL contextPath;
@Drone
private WebDriver webdriver;
@Deployment
public static WebArchive createDeployment() {
WebArchive war = ShrinkWrap.create(WebArchive.class)
.addClass(MyFilter.class)
.setWebXML(generateWebXMLAsset());
System.out.println(war.toString(true));
return war;
}
private static Asset generateWebXMLAsset() {
WebAppDescriptor wad = Descriptors.create(WebAppDescriptor.class);
wad.version(WebAppVersionType._3_0)
.createFilter()
.filterName(MyFilter.class.getSimpleName())
.filterClass(MyFilter.class.getName())
.createInitParam()
.paramName("enabled")
.paramValue("false")
.up()
.up()
.createFilterMapping()
.filterName(MyFilter.class.getSimpleName())
.urlPattern("/*")
.up();
System.out.println(wad.exportAsString());
return new StringAsset(wad.exportAsString());
}
@Test
public void testDoFilter() {
Warp.initiate(new Activity() {
@Override
public void perform() {
System.out.println("URL: " + contextPath.toString());
webdriver.navigate().to(contextPath);
}
}).inspect(new Inspection() {
@ArquillianResource
HttpServletRequest request;
@ArquillianResource
HttpServletResponse response;
@BeforeServlet
public void before() {
List attributeNames
= Collections.list(request.getAttributeNames());
System.out.println("Attributes: "
+ Arrays.toString(attributeNames.toArray()));
String attribute
= (String) request.getAttribute("X-ATTRIBUTE");
...
}
@AfterServlet
public void after() {
System.out.println("Headers: "
+ Arrays.toString(response.getHeaderNames().toArray()));
String header = response.getHeader("X-HEADER");
...
}
});
}
}
Droidium
・Android browser, Android UI
・Create AVD(Android Virtual Device)
Performance
・Timeouts, execution time
Microbenchmark
・Performance test
@Test
@MicroBenchmark(threads = 10, iterations = 1000, warmupIterations = 1)
@MicroBenchmarkAssertion(total = 5000, average = 25) // ms
public void testThroughputAndAverageResponseTime() {
...
}
★カスタム拡張
META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension
com.xxx.CustomArquillianExtension
import org.jboss.arquillian.core.spi.LoadableExtension;
import org.jboss.arquillian.core.api.annotation.Observes;
import org.jboss.arquillian.core.api.event.ManagerStarted;
import org.jboss.arquillian.config.descriptor.api.ArquillianDescriptor;
public class CustomArquillianExtension implements LoadableExtension {
public void register(ExtensionBuilder builder) {
builder.observer(CustomSuite.class);
}
public static class CustomSuite {
...
public void startup(
@Observes(precedence = -100) ManagerStarted event,
ArquillianDescriptor descriptor) {
...
String className = descriptor.extension("suite")
.getExtensionProperties().get("deploymentClass");
...
}
...
}
}
arquillian.xml
<arquillian ...>
...
<extension qualifier="suite">
<property name="deploymentClass">
com.xxx.Deployments
</property>
</extension>
...
</arquillian>
public class Deployments {
@Deployment
public static Archive<?> deployment() {
...
}
}