Arquillian / TestNG method invocation sequence
dmiklancic Oct 6, 2011 9:15 AMVersion:1.0 StartHTML:0000000167 EndHTML:0000029271 StartFragment:0000000454 EndFragment:0000029255
Running Arquillian managed container, JBoss 7.0.2
Sequence:
- Start JBoss
- TestNG Before Suite (performed out of container; no test class injections)
- TestNG Before Test (performed out of container; no test class injections)
- Deploy arquillian and @Deployment war
- TestNG Before Class (performed out of container; no test class injections)
- TestNG Before Method (performed out of container; no test class injections)
- TestNG Before Suite (in container; no injections)
- TestNG Before Test (in container; no injections)
- TestNG Before Class (in container; no injections)
- TestNG Before Method (in container; test class INJECTIONS available)
- TestNG test method (in container; test class INJECTIONS available)
- TestNG After Method (in container; test class INJECTIONS available)
- TestNG After Class (in container; test class INJECTIONS available)
- TestNG After Test (in container; test class INJECTIONS available)
- TestNG After Suite (in container; test class INJECTIONS available)
- TestNG After Method (performed out of container; no test class injections)
- TestNG Before Method (performed out of container; no test class injections)
- TestNG Before Suite (in container; no injections)
- TestNG Before Test (in container; no injections)
- TestNG Before Class (in container; no injections)
- TestNG Before Method (in container; test class INJECTIONS available)
- TestNG test method (in container; test class INJECTIONS available)
- TestNG After Method (in container; test class INJECTIONS available)
- TestNG After Class (in container; test class INJECTIONS available)
- TestNG After Test (in container; test class INJECTIONS available)
- TestNG After Suite (in container; test class INJECTIONS available)
- TestNG After Method (performed out of container; no test class injections)
- TestNG After Class (performed out of container; no test class injections)
- Undeploy war
- TestNG After Test (performed out of container; no test class injections)
- TestNG After Suite (performed out of container; no test class injections)
- Undeploy arquillian
- Stop JBoss (?)
From what I observe, there are two overlapping TestNG lifecycles being performed. One lifecycle (in black text) is performed on the client side; the other lifecycle is performed in its entirety for each test method inside the container (red text). It appears that test class injections, resources, etc., are only available in the BeforeMethod, test methods and AfterMethod phases of the lifecycle (although the injections appear to “hang around” in the AfterClass, AfterTest and AfterSuite methods).
Interestingly, if a test class @Resource is coded, the BeforeMethod and following phases are NOT executed in container (ARQ-563), yet the test “passes”. Note: @Inject seems to work as documented.
Following is a log trace supporting the above summary (extraneous entires have been omitted).
Question: Is this how Arquillian and TestNG are designed to work together? It seems to follow the diagram provided in the Arquillian documentation, except the diagram does not really portray the overlapping lifecycles.
If this is the case, can one assume the client-side lifecycle is for arquillian's purposes (i.e. to start / stop services, deploy / undeploy wars)? If so, how can one code a BeforeMethod that is only invoked when running in container? Right now, the BeforeMethod executes both on the client and in container and if it depends on an injected object, it will fail when running on the client-side since the injections are not available there. (I am current coding: if (injectedObject != null) to distinguish between the two invocations.
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running TestSuite
Oct 6, 2011 8:00:26 AM org.jboss.as.arquillian.container.managed.ManagedDeployableContainer startInternal
INFO: Starting container with: [java, -Xmx512m, -XX:MaxPermSize=128m, -Djboss.home.dir=/Users/miklandj/Development/JBoss7/jboss-as-web-7.0.2.Final,
. . .
08:00:30,526 INFO [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-1) Bound data source [java:/ProcessNetworkDS]
. . .
08:00:31,021 INFO [org.jboss.as] (Controller Boot Thread) JBoss AS 7.0.2.Final "Arc" started in 3779ms - Started 129 of 187 services (58 services are passive or on-demand)
. . .
[08:00:32,585] INFO (SecurityDataServiceTest.java:84) - Before suite: session bean null, user tx null
[08:00:32,591] INFO (SecurityDataServiceTest.java:89) - Before test: session bean null, user tx null
. . .
[08:00:35,515] INFO (ArquillianServiceDeployer.java:56) - Deploy arquillian service: arquillian-service: 1549 assets
. . .
08:00:47,042 INFO [org.jboss.web] (MSC service thread 1-3) registering web context: /securityDataService
08:00:47,063 INFO [org.jboss.as.server.controller] (pool-1-thread-1) Deployed "securityDataService.war"
. . .
[08:00:47,350] INFO (SecurityDataServiceTest.java:97) - Before class: session bean null, user tx null
[08:00:47,370] INFO (SecurityDataServiceTest.java:102) - Before method: session bean null, user tx null
08:00:48,169 INFO [stdout] (RMI TCP Connection(3)-127.0.0.1) (service.SecurityDataServiceTest 84 ) Before suite: session bean null, user tx null
08:00:48,170 INFO [stdout] (RMI TCP Connection(3)-127.0.0.1) (service.SecurityDataServiceTest 89 ) Before test: session bean null, user tx null
08:00:48,173 INFO [stdout] (RMI TCP Connection(3)-127.0.0.1) (service.SecurityDataServiceTest 97 ) Before class: session bean null, user tx null
08:00:48,263 INFO [stdout] (RMI TCP Connection(3)-127.0.0.1) (service.SecurityDataServiceTest 102 ) Before method: session bean Proxy for view class: com.bp.cpr.pn.business.user.security.service.SecurityDataService of EJB: SecurityDataServiceBean, user tx Transaction: unknown
08:00:48,877 INFO [stdout] (RMI TCP Connection(3)-127.0.0.1) Loaded user security tables.
08:00:48,959 INFO [stdout] (RMI TCP Connection(3)-127.0.0.1) (service.SecurityDataServiceTest 125 ) After method: session bean Proxy for view class: com.bp.cpr.pn.business.user.security.service.SecurityDataService of EJB: SecurityDataServiceBean, user tx Transaction: unknown
08:00:48,961 INFO [stdout] (RMI TCP Connection(3)-127.0.0.1) (service.SecurityDataServiceTest 120 ) After class: session bean Proxy for view class: com.bp.cpr.pn.business.user.security.service.SecurityDataService of EJB: SecurityDataServiceBean, user tx Transaction: unknown,
08:00:48,963 INFO [stdout] (RMI TCP Connection(3)-127.0.0.1) (service.SecurityDataServiceTest 116 ) After test: session bean Proxy for view class: com.bp.cpr.pn.business.user.security.service.SecurityDataService of EJB: SecurityDataServiceBean, user tx Transaction: unknown
08:00:48,964 INFO [stdout] (RMI TCP Connection(3)-127.0.0.1) (service.SecurityDataServiceTest 111 ) After suite: session bean Proxy for view class: com.bp.cpr.pn.business.user.security.service.SecurityDataService of EJB: SecurityDataServiceBean, user tx Transaction: unknown
[08:00:48,990] INFO (SecurityDataServiceTest.java:125) - After method: session bean null, user tx null
[08:00:48,993] INFO (SecurityDataServiceTest.java:102) - Before method: session bean null, user tx null
08:00:49,080 INFO [stdout] (RMI TCP Connection(3)-127.0.0.1) (service.SecurityDataServiceTest 84 ) Before suite: session bean null, user tx null
08:00:49,081 INFO [stdout] (RMI TCP Connection(3)-127.0.0.1) (service.SecurityDataServiceTest 89 ) Before test: session bean null, user tx null
08:00:49,083 INFO [stdout] (RMI TCP Connection(3)-127.0.0.1) (service.SecurityDataServiceTest 97 ) Before class: session bean null, user tx null
08:00:49,087 INFO [stdout] (RMI TCP Connection(3)-127.0.0.1) (service.SecurityDataServiceTest 102 ) Before method: session bean Proxy for view class: com.bp.cpr.pn.business.user.security.service.SecurityDataService of EJB: SecurityDataServiceBean, user tx Transaction: unknown
08:00:49,209 INFO [stdout] (RMI TCP Connection(3)-127.0.0.1) Loaded user security tables.
08:00:49,267 INFO [stdout] (RMI TCP Connection(3)-127.0.0.1) (service.SecurityDataServiceTest 125 ) After method: session bean Proxy for view class: com.bp.cpr.pn.business.user.security.service.SecurityDataService of EJB: SecurityDataServiceBean, user tx Transaction: unknown
08:00:49,269 INFO [stdout] (RMI TCP Connection(3)-127.0.0.1) (service.SecurityDataServiceTest 120 ) After class: session bean Proxy for view class: com.bp.cpr.pn.business.user.security.service.SecurityDataService of EJB: SecurityDataServiceBean, user tx Transaction: unknown
08:00:49,270 INFO [stdout] (RMI TCP Connection(3)-127.0.0.1) (service.SecurityDataServiceTest 116 ) After test: session bean Proxy for view class: com.bp.cpr.pn.business.user.security.service.SecurityDataService of EJB: SecurityDataServiceBean, user tx Transaction: unknown
08:00:49,271 INFO [stdout] (RMI TCP Connection(3)-127.0.0.1) (service.SecurityDataServiceTest 111 ) After suite: session bean Proxy for view class: com.bp.cpr.pn.business.user.security.service.SecurityDataService of EJB: SecurityDataServiceBean, user tx Transaction: unknown
[08:00:49,274] INFO (SecurityDataServiceTest.java:125) - After method: session bean null, user tx null
[08:00:49,753] INFO (SecurityDataServiceTest.java:120) - After class: session bean null, user tx null
08:00:49,896 INFO [org.jboss.weld] (MSC service thread 1-4) Stopping weld service
08:00:49,900 INFO [org.jboss.jpa] (MSC service thread 1-4) stopping Persistence Unit Service 'securityDataService.war#businessUserSecurity'
08:00:49,913 INFO [org.jboss.as.server.controller] (pool-1-thread-1) Undeployed "securityDataService.war"
08:00:49,974 INFO [org.jboss.as.server.deployment] (MSC service thread 1-1) Stopped deployment securityDataService.war in 164ms
[08:00:49,981] INFO (SecurityDataServiceTest.java:116) - After test: session bean null, user tx null
[08:00:49,992] INFO (SecurityDataServiceTest.java:111) - After suite: session bean null, user tx null
[08:00:49,999] INFO (ArquillianServiceDeployer.java:71) - Undeploy arquillian service: arquillian-service: 1549 assets
08:00:50,073 INFO [org.jboss.as.server.controller] (pool-1-thread-1) Undeployed "arquillian-service"
08:00:50,085 INFO [org.jboss.as.osgi] (MSC service thread 1-1) JBAS011922: Unregister module: Module "deployment.arquillian-service:main" from Service Module Loader
08:00:50,086 ERROR [org.jboss.osgi.framework.internal.BundleManager] (MSC service thread 1-1) Cannot find bundle associated with module: deployment.arquillian-service:main
08:00:50,106 INFO [org.jboss.as.server.deployment] (MSC service thread 1-1) Stopped deployment arquillian-service in 73ms
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 24.802 sec
Results :
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 47.933s
[INFO] Finished at: Thu Oct 06 08:00:50 EDT 2011
[INFO] Final Memory: 49M/110M
[INFO] ------------------------------------------------------------------------