Jetty as a test-suite decorator
9 Jul, 2004
Marty Andrews and I have been working on a small project together. It's primarily intended as a demo of continuous integration, but has also given us the opportunity to play with some new technologies/ideas.
One of the coolest tricks we picked up (from Cactus) was to start/stop a web-server as part of running the tests, rather than depending on having one running already.
(In the past I've typically written Ant scripts that dump a WAR-file in a magic directory, and wait "a bit" for the server to auto-deploy it, before running my HTTP-based acceptance-tests. This is way nicer.)
The key is a test decorator that starts Jetty to serve our web-app:
package com.thoughtworks.todolist; import junit.extensions.TestSetup; import junit.framework.Test; import org.mortbay.jetty.Server; import org.mortbay.util.InetAddrPort; public class JettyTestSetup extends TestSetup { private Server _server; public JettyTestSetup(Test test) { super(test); } protected void setUp() throws Exception { _server = new Server(); _server.addListener(new InetAddrPort(9999)); _server.addWebApplication( "/todolist", "build/todolist.war" ); _server.start(); } protected void tearDown() throws Exception { _server.stop(); _server = null; } }
As you can see, it's not hard to get a Jetty server going. Jetty is nice and lightweight, too: it's small (less than 600k), and starts up fast (less than a second here).
Now, it's a simple matter to decorate our test-suite with JettyTestSetup:
public class AllAcceptanceTests { public static Test suite() throws Exception { TestSuite suite = new TestSuite(); suite.addTestSuite(ViewListTest.class); suite.addTestSuite(AddItemTest.class); // ... etc ... return new JettyTestSetup(suite); } }
That's it. The server gets started at the beginning of the suite, and stopped afterward.
Feedback