7 Replies Latest reply: Sep 27, 2011 3:55 AM by Aslak Knutsen RSS

Splitting tests into groups ?

Craig Greenhalgh Newbie

Hi is it possible to split tests in "groups"

 

I have a few hundred tests that when ran together cause an outofmemory issue.  Is its possible to group tests so each group causes the application server (im using jboss7) to stop and restart?

 

Or is there an easier way to resolve this?  I've assigned more memory etc

 

Thanks

 

Craig

  • 1. Re: Splitting tests into groups ?
    Aslak Knutsen Master

    You can split in groups using Maven by define multiple surefire executions with include/exclude filters etc..

     

    But arquillian does have a some what hidden feature, where it can restart the container after X number for tests ran. This works best with Managed containers of course, since Remote containers arn't actually restarted, but rather reconnected so it has no effect.

     

     

     

    <?xml version="1.0" encoding="UTF-8"?>
    <arquillian xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://jboss.org/schema/arquillian"
        xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
    
        <engine>
          <property name="maxTestClassesBeforeRestart">20</property>
        </engine>
      
    </arquillian>
    
  • 2. Re: Splitting tests into groups ?
    Craig Greenhalgh Newbie

    When I set this to 2, all my tests run, but after the the first 2 classes the rest fail

     

    I get.....

     

    java.io.IOException: The client has been closed.

        at com.sun.jmx.remote.internal.ClientCommunicatorAdmin.restart(ClientCommunicatorAdmin.java:92)

        at com.sun.jmx.remote.internal.ClientCommunicatorAdmin.gotIOException(ClientCommunicatorAdmin.java:52)

        at javax.management.remote.rmi.RMIConnector$RMIClientCommunicatorAdmin.gotIOException(RMIConnector.java:1450)

        at javax.management.remote.rmi.RMIConnector.addListenersWithSubjects(RMIConnector.java:579)

        at javax.management.remote.rmi.RMIConnector.addListenerWithSubject(RMIConnector.java:548)

        at javax.management.remote.rmi.RMIConnector.access$700(RMIConnector.java:122)

        at javax.management.remote.rmi.RMIConnector$RemoteMBeanServerConnection.addNotificationListener(RMIConnector.java:1217)

        at org.jboss.arquillian.protocol.jmx.JMXMethodExecutor.invoke(JMXMethodExecutor.java:71)

        at org.jboss.arquillian.container.test.impl.execution.RemoteTestExecuter.execute(RemoteTestExecuter.java:120)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:616)

        at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:90)

        at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99)

        at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81)

        at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:134)

        at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:114)

        at org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.java:67)

        at org.jboss.arquillian.container.test.impl.execution.ClientTestExecuter.execute(ClientTestExecuter.java:68)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:616)

        at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:90)

        at org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:99)

        at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:81)

        at org.jboss.arquillian.container.test.impl.client.ContainerEventController.createContext(ContainerEventController.java:130)

        at org.jboss.arquillian.container.test.impl.client.ContainerEventController.createTestContext(ContainerEventController.java:117)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:616)

        at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:90)

        at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)

        at org.jboss.arquillian.test.impl.TestContextHandler.createTestContext(TestContextHandler.java:82)

        at sun.reflect.GeneratedMethodAccessor17.invoke(Unknown Source)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:616)

        at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:90)

        at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)

        at org.jboss.arquillian.test.impl.TestContextHandler.createClassContext(TestContextHandler.java:68)

        at sun.reflect.GeneratedMethodAccessor16.invoke(Unknown Source)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:616)

        at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:90)

        at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)

        at org.jboss.arquillian.test.impl.TestContextHandler.createSuiteContext(TestContextHandler.java:54)

        at sun.reflect.GeneratedMethodAccessor13.invoke(Unknown Source)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:616)

        at org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:90)

        at org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:88)

        at org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:134)

        at org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.test(EventTestRunnerAdaptor.java:111)

        at org.jboss.arquillian.junit.Arquillian$6.evaluate(Arquillian.java:239)

        at org.jboss.arquillian.junit.Arquillian$4.evaluate(Arquillian.java:202)

        at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:290)

        at org.jboss.arquillian.junit.Arquillian.access$100(Arquillian.java:45)

        at org.jboss.arquillian.junit.Arquillian$5.evaluate(Arquillian.java:216)

        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)

        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)

        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)

        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)

        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)

        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)

        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)

        at org.jboss.arquillian.junit.Arquillian$2.evaluate(Arquillian.java:161)

        at org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:290)

        at org.jboss.arquillian.junit.Arquillian.access$100(Arquillian.java:45)

        at org.jboss.arquillian.junit.Arquillian$3.evaluate(Arquillian.java:175)

        at org.junit.runners.ParentRunner.run(ParentRunner.java:236)

        at org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:123)

        at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:35)

        at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:146)

        at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:97)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:616)

        at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103)

        at $Proxy0.invoke(Unknown Source)

        at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:145)

        at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:87)

        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)

     

     

    Any ideas?

     

    Thanks

     

    Craig

  • 3. Re: Splitting tests into groups ?
    Aslak Knutsen Master

    hmm, looks like we have some issue in the jmx protocol impl with restarts.. please file a jira http://jira.jboss.org/jira/browse/AS7 in the testsuite component.

     

    You can try using the Servlet 3.0 protocol instead for now, it might help.

     

    Add this to arquillian.xml:

     

    <arquillian>
         <defaultProtocol type="Servlet 3.0" />
    </arquillian>
    

     

    And add a dependency to org.jboss.arquillian.protocol:arquillian-protocol-servlet

  • 4. Re: Splitting tests into groups ?
    Craig Greenhalgh Newbie

    When I add

     

         <dependency>

             <groupId>org.jboss.arquillian.protocol</groupId>

             <artifactId>arquillian-protocol-servlet</artifactId>

             <version>1.0.0.CR1</version>

             <scope>test</scope>

          </dependency>    

     

    I get the following error

     

    java.lang.IllegalArgumentException: No org.jboss.arquillian.container.spi.client.protocol.metadata.HTTPContext found in org.jboss.arquillian.container.spi.client.protocol.metadata.ProtocolMetaData. Servlet protocol can not be used

        at org.jboss.arquillian.protocol.servlet.ServletUtil.determineBaseURI(ServletUtil.java:75)

        at org.jboss.arquillian.protocol.servlet.BaseServletProtocol.getExecutor(BaseServletProtocol.java:58)

        at org.jboss.arquillian.protocol.servlet.BaseServletProtocol.getExecutor(BaseServletProtocol.java:32)

        at org.jboss.arquillian.container.test.impl.execution.RemoteTestExecuter.getContainerMethodExecutor(RemoteTestExecuter.java:136)

        at org.jboss.arquillian.container.test.impl.execution.RemoteTestExecuter.execute(RemoteTestExecuter.java:119)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

     

     

    Am I adding the dependency correctly ?

     

    Thanks

     

    Craig

  • 5. Re: Splitting tests into groups ?
    Aslak Knutsen Master

    hmm, which JBoss AS 7 version are you using ? and what are you deploying ?

  • 6. Re: Splitting tests into groups ?
    Craig Greenhalgh Newbie

    Updated the previous post as the dependency was not being shown

     

    I'm using Jboss 7.0.1 Final

     

    Thanks

     

    Craig

  • 7. Re: Splitting tests into groups ?
    Aslak Knutsen Master

    can you post your pom.xml and the TestClass ?