I didn't mean that I want to run core tests. I need to run junits for wicket-based web applications in 3-4 parallel threads. We have a lot of tests based on WicketTester and it takes a lot of time to run them. Parallel running reduces execution time significantly. But as far as I can see it's impossible with wicket 1.4. I'm not sure about 1.5.x but I can't migrate to this version just to check.
22 декабря 2011 г. 18:25 пользователь Martin Grigorov <mgrigo...@apache.org>написал: > Hi, > > Some people ran 1.5.x core tests in parallel with JUnit/Surefire > parallel support and the problems they had were related with setting > current Locale with Locale.setDefault(), i.e. JVM wide. Some tests > expect specific i18n-ized results and due to changed Locale they > failed. > > Improvements in this area for 1.4.x wont be done but you can provide > patches for 1.5 if there are no API breaks and for 6.0 with API > changes. > > On Thu, Dec 22, 2011 at 5:18 PM, Vervenko Pavel <willcode4f...@tut.by> > wrote: > > Hi! > > We are using wicket-1.4.8. > > We have a lot of unit tests and it takes long time to run them. To reduce > > running time at multi-core systems we decided to run them parallel in > > multiple threads. > > I use this > > > http://mycila.googlecode.com/svn/sandbox/src/main/java/com/mycila/sandbox/junit/runner/ConcurrentSuite.java > > class > > to run junits concurrently. > > First problem I've faced with was some exception from > > org.apache.wicket.jmx.Initializer : > > *org.apache.wicket.WicketRuntimeException: > > javax.management.InstanceAlreadyExistsException: > > org.apache.wicket.app.SimpleWicketTester$1:type=Application > > at org.apache.wicket.jmx.Initializer.init(Initializer.java:207) > > at > > org.apache.wicket.Application.callInitializers(Application.java:843) > > at > > org.apache.wicket.Application.initializeComponents(Application.java:678) > > at > > org.apache.wicket.protocol.http.WicketFilter.init(WicketFilter.java:725) > > at > > > org.apache.wicket.protocol.http.MockWebApplication.<init>(MockWebApplication.java:168) > > > > at > > > org.apache.wicket.util.tester.BaseWicketTester.<init>(BaseWicketTester.java:219) > > > > at > > org.apache.wicket.util.tester.WicketTester.<init>(WicketTester.java:325) > > at > > org.apache.wicket.util.tester.WicketTester.<init>(WicketTester.java:308) > > at > > > com.infoblox.platform.test.PlatformWicketTester.<init>(PlatformWicketTester.java:60) > > > > at > > > com.infoblox.nios.ui.widget.test.SimpleWicketTester.setUp(SimpleWicketTester.java:54) > > * > > > > I've patched the Initializer file, added some synchronization: > > * > > synchronized (mbeanServer) { > > > > > > int i = 0; > > while (mbeanServer.isRegistered(appBeanName)) > > { > > tempDomain = name + "-" + i++; //$NON-NLS-1$ > > appBeanName = new ObjectName(tempDomain + ":type=Application"); > > //$NON-NLS-1$ > > } > > domain = tempDomain; > > > > Application appBean = new Application(application); > > register(appBean, appBeanName); > > > > register(new ApplicationSettings(application), new ObjectName(domain + > > ":type=Application,name=ApplicationSettings")); //$NON-NLS-1$ > > register(new DebugSettings(application), new ObjectName(domain + > > ":type=Application,name=DebugSettings")); //$NON-NLS-1$ > > register(new MarkupSettings(application), new ObjectName(domain + > > ":type=Application,name=MarkupSettings")); //$NON-NLS-1$ > > register(new ResourceSettings(application), new ObjectName(domain + > > ":type=Application,name=ResourceSettings")); //$NON-NLS-1$ > > register(new PageSettings(application), new ObjectName(domain + > > ":type=Application,name=PageSettings")); //$NON-NLS-1$ > > register(new RequestCycleSettings(application), new ObjectName(domain > + > > ":type=Application,name=RequestCycleSettings")); //$NON-NLS-1$ > > register(new SecuritySettings(application), new ObjectName(domain + > > ":type=Application,name=SecuritySettings")); //$NON-NLS-1$ > > register(new SessionSettings(application), new ObjectName(domain + > > ":type=Application,name=SessionSettings")); //$NON-NLS-1$ > > register(new CookieValuePersisterSettings(application), new > > ObjectName(domain + > > ":type=Application,name=CookieValuePersisterSettings")); //$NON-NLS-1$ > > > > RequestLogger sessionsBean = new RequestLogger(application); > > ObjectName sessionsBeanName = new ObjectName(domain + > > ":type=RequestLogger"); //$NON-NLS-1$ > > register(sessionsBean, sessionsBeanName); > > }* > > > > and the problem was gone. > > > > The second problem I found was such mysterious exceptions from different > > classes: > > *org.apache.wicket.WicketRuntimeException: Exception in rendering > > component: [MarkupContainer [Component id = _header_0]] > > at > org.apache.wicket.Component.renderComponent(Component.java:2658) > > at > > org.apache.wicket.MarkupContainer.onRender(MarkupContainer.java:1512) > > at org.apache.wicket.Component.render(Component.java:2450) > > at > > org.apache.wicket.MarkupContainer.autoAdd(MarkupContainer.java:229) > > at > > > org.apache.wicket.markup.resolver.HtmlHeaderResolver.resolve(HtmlHeaderResolver.java:80) > > > > at > > > org.apache.wicket.markup.resolver.ComponentResolvers.resolve(ComponentResolvers.java:81) > > > > at > > org.apache.wicket.MarkupContainer.renderNext(MarkupContainer.java:1418) > > at > > org.apache.wicket.MarkupContainer.renderAll(MarkupContainer.java:1528) > > at org.apache.wicket.Page.onRender(Page.java:1565) > > at org.apache.wicket.Component.render(Component.java:2450) > > at org.apache.wicket.Page.renderPage(Page.java:914) > > at > > > org.apache.wicket.request.target.component.PageRequestTarget.respond(PageRequestTarget.java:63) > > > > at > > > org.apache.wicket.request.AbstractRequestCycleProcessor.respond(AbstractRequestCycleProcessor.java:105) > > > > at > > > org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1258) > > > > at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329) > > at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428) > > at org.apache.wicket.RequestCycle.request(RequestCycle.java:545) > > at > > > org.apache.wicket.protocol.http.MockWebApplication.processRequestCycle(MockWebApplication.java:524) > > > > at > > > org.apache.wicket.util.tester.BaseWicketTester.executeListener(BaseWicketTester.java:265) > > > > at > > > org.apache.wicket.util.tester.BaseWicketTester.startPage(BaseWicketTester.java:249) > > > > at > > > com.infoblox.nios.ui.widget.test.DummyPlatformWicketTester.startPlatformPanel(DummyPlatformWicketTester.java:440) > > > > at > > > com.infoblox.nios.ui.page.permissions.dialogs.TestCommonPermissionPanel.testRoleCorrectRender(TestCommonPermissionPanel.java:84) > > > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) > > at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) > > at java.lang.reflect.Method.invoke(Unknown Source) > > at > > > org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) > > > > at > > > org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) > > > > at > > > org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) > > > > at > > > org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) > > > > at > > > org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) > > > > at > > > org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) > > at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) > > at > > > org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) > > > > at > > > org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) > > > > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) > > at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) > > at > > org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) > > at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) > > at > org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) > > at org.junit.runners.ParentRunner.run(ParentRunner.java:300) > > at org.junit.runners.Suite.runChild(Suite.java:128) > > at org.junit.runners.Suite.runChild(Suite.java:24) > > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) > > at java.util.concurrent.Executors$RunnableAdapter.call(Unknown > > Source) > > at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) > > at java.util.concurrent.FutureTask.run(Unknown Source) > > at java.util.concurrent.Executors$RunnableAdapter.call(Unknown > > Source) > > at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) > > at java.util.concurrent.FutureTask.run(Unknown Source) > > at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown > > Source) > > at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown > > Source) > > at java.lang.Thread.run(Unknown Source) > > Caused by: java.lang.NullPointerException > > at java.util.concurrent.ConcurrentHashMap.putIfAbsent(Unknown > > Source) > > at org.apache.wicket.SharedResources.add(SharedResources.java:162) > > at > > org.apache.wicket.ResourceReference.bind(ResourceReference.java:167) > > at > > > org.apache.wicket.ResourceReference.getSharedResourceKey(ResourceReference.java:230) > > > > at org.apache.wicket.RequestCycle.urlFor(RequestCycle.java:1068) > > at org.apache.wicket.RequestCycle.urlFor(RequestCycle.java:1053) > > at > > > org.apache.wicket.markup.html.internal.HeaderResponse.renderJavascriptReference(HeaderResponse.java:157) > > > > at > > > com.infoblox.widget.ext.ExtInitializerBehavior.renderOptional(ExtInitializerBehavior.java:263) > > > > at > > > com.infoblox.widget.ext.ExtBaseInitializer.renderHead(ExtBaseInitializer.java:126) > > > > at > > > com.infoblox.widget.ext.ExtInitializerBehavior.renderHead(ExtInitializerBehavior.java:158) > > > > at > > > com.infoblox.nios.ui.page.IBExtInitializerBehavior.renderHead(IBExtInitializerBehavior.java:107) > > > > at org.apache.wicket.Component.renderHead(Component.java:2701) > > at > > > org.apache.wicket.markup.html.internal.HtmlHeaderContainer.renderHeaderSections(HtmlHeaderContainer.java:218) > > > > at > > > org.apache.wicket.markup.html.internal.HtmlHeaderContainer.onComponentTagBody(HtmlHeaderContainer.java:137) > > > > at > org.apache.wicket.Component.renderComponent(Component.java:2619) > > ... 52 more* > > > > Then I found the notice in the > > org.apache.wicket.protocol.http.MockWebApplication: > > * * <p> > > * IMPORTANT NOTES > > * <ul> > > * <li>This harness is SINGLE THREADED - there is only one global > session. > > For multi-threaded > > * testing you must do integration testing with a full tester server. > > * </ul>* > > If I got correctly, Wicket testers can't be run in multiple threads. > > But this class is absent in new version of wicket, 1.5.x. > > Does that mean that there are no concurrency problems with WicketTester > in > > 1.5.x version? > > I'll be thankful for any tips of running wicket tests in paralllel. > > > > Thanks > > > > -- > Martin Grigorov > jWeekend > Training, Consulting, Development > http://jWeekend.com > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org > For additional commands, e-mail: users-h...@wicket.apache.org > >