Testen von Wicket-Anwendungen
Spring-Applikationskontext in Tests
-
Für Spring stehen in
spring-testBasisklassen für Tests zur Verfügung.AbstractJUnit4SpringContextTestserzeugt den Applikationskontext und injiziert mit@Autowiredannotierte Felder:@ContextConfiguration(locations = { "classpath:spring.xml" }) public class SomeTest extends AbstractJUnit4SpringContextTests { @Autowired private SomeService someService; @Test public void testSomething() { assertTrue(someService.isWorking()); } }
-
Hinweis: Spring 2.5 unterstützt nur
JUnitbis Version 4.4!
WicketTester + Spring I
-
Wicket bietet mit
WicketTesterUnterstützung für das Testen von Wicket-Seiten.WicketTesterist dabei mit der Applikationsklasse zu erzeugen. Es empfiehlt sich, der Applikatonsklasse den Spring-ApplicationContextvon außen zu setzen:public class SomeWicketApplication extends WebApplication implements ApplicationContextAware { public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { injector = new SpringComponentInjector(this, applicationContext); addComponentInstantiationListener(injector); } }
WicketTester + Spring II
-
In einer
@Before-Methode sollte ein neuer Wicket-Tester mit der Applikation erzeugt werden:@ContextConfiguration(locations = { "classpath:spring.xml" }) public class SomeTest extends AbstractJUnit4SpringContextTests { private WicketTester tester; @Before public void setUp() { SomeWicketApplication app = new SomeWicketApplication(); app.setApplicationContext(this.applicationContext); tester = new WicketTester(app); } }
WicketTester API: Aktionen
-
Seitenaufrufe:
tester.startPage(SomePage.class) tester.startPage(new TestPageSource() { public Page getTestPage() { return new SomePage(); } });
-
Links auslösen:
tester.clickLink("someContainer:someButton")
WicketTester API: Formulare
-
Formulare ausfüllen und absenden:
FormTester someForm = tester.newFormTester("someForm"); someForm.setValue("someField", "some text"); someForm.submit();
WicketTester API: Assertions
-
Wurde eine bestimmte Seite erfolgreich gerendert?
tester.assertRenderedPage(SomePage.class);
-
Existiert eine bestimmte Komponente (
wicket:id) auf der zuletzt gerenderten Seite?tester.assertComponent("someComponent", Button.class);
-
Existiert ein bestimmtes Label auf der zuletzt gerenderten Seite?
tester.assertLabel("someLabel", "text");
-
Enthält die zuletzt gerenderte Seite einen bestimmten Text?
tester.assertContains("text");
Selenium
WicketTestersimuliert Abfragen gegen das Wicket-Komponentenmodell, dabei kann insbesondere der Zustand der Komponenten verwendet und geprüft werden.Seleniumgeht einen Schritt weiter: Die Web-Anwendung wird von außen mit einem ferngesteuerten Browser (IE/Firefox/Opera/Safari) bedient - auch browserabhängige Logik und Ajax/JavaScript-Code können getestet werden.Selenium IDEist ein Firefox-Plug-in um Tests aufzuzeichnen und abzuspielen: http://seleniumhq.org/projects/ide/- Tests können als JUnit-Tests exportiert werden und mit
Selenium Remote Control (RC)ausgeführt werden: http://seleniumhq.org/projects/remote-control/
Selenium IDE
Best Practices: Tests
- Es empfiehlt sich, vor jedem Testfall klare Ausgangsbedingungen zu schaffen (z.B. mit
DBUnithttp://www.dbunit.org/) und Tests nicht aufeinander aufzubauen. - Tests sollten schnell ausführbar sein (Problem: Je länger Tests laufen, umso seltener führen Entwickler Tests aus). Gegenfalls sollten Services gemockt werden (z.B. mit EasyMock http://easymock.org/).
Test-First- Tests sollten konsequent vor den zu testenden Komponenten erstellt werden: http://de.wikipedia.org/wiki/Testgetriebene_Entwicklung
Weitere Informationen
- Apache Wicket Testing: http://cwiki.apache.org/WICKET/testing.html
- Selenium: http://seleniumhq.org/

