Project

General

Profile

Actions

How to Unit Test in Z2 » History » Revision 8

« Previous | Revision 8/12 (diff) | Next »
Henning Blohm, 16.08.2021 10:53


How to Unit Test in Z2

(Applies to z2 Version 2.9 and later)

The Z2 Jupiter of z2-base.base allow to run in-system tests on z2, from anywhere where you can run JUnit tests. To learn more about the JUnit testing framework, please visit http://www.junit.org.

In-system tests are ordinary unit tests that run within the server environment. Running tests within the running environment is also called integration testing.

Standard JUnit tests run in an environment that often has little to do with the tested code's "native" environment, other than seeing the same types. Anything else, database connectivity, domain test data, component and naming abstractions (e.g. JNDI) need to be firstly abstracted out from the tested code and secondly mocked, that is, simulated one way or the other, into the test assembly of things.

While that has the advantage of a defined, clean-room test bed, for higher-level components this can become unreasonable and assuring the correctness of the mocked up environment becomes a testing issue on its own.

The z2 Jupiter feature is built on the JUnit 5 API that succeeded the JUnit 4 API that is the underlying foundation of the previously promoted z2Unit feature (see How to z2Unit). It is recommended that you use the z2 Jupiter implementation today starting with z2 Version 2.9.

The foundation Z2 Jupiter is the Z2 Jupiter Test Engine implementation that delegate test discovery and test execution to a running z2 server runtime. That is, although JUnit believes to run a locally defined test class, the actual test runs in another process, running the methods and reporting results corresponding to the structure of the local test implementation (which matches its server-side equivalent).

Using z2 Jupiter

Using z2 Jupiter is as easy as referencing the module com.zfabrik.dev.z2jupiter from the test module and adding one more annotation to your test class: Z2JupiterTestable.

Z2 Jupiter uses itself for testing. You can see a simple "Hello World" test at z2-base:source:base|com.zfabrik.dev.z2jupiter/java/src.test/com/zfabrik/dev/z2jupiter/test/HelloZ2JupiterTest.java:

package com.zfabrik.dev.z2jupiter.test;

import org.junit.jupiter.api.Test;

import com.zfabrik.dev.z2jupiter.Z2JupiterTestable;
import com.zfabrik.dev.z2jupiter.impl.Z2JupiterImpl;

@Z2JupiterTestable(componentName = Z2JupiterImpl.MODULE_NAME)
public class HelloZ2JupiterTest {

    @Test
    public void helloZ2Jupiter() {
        System.err.println("Hello Z2 Jupiter");
    }
}

Check out more test examples in z2-base:source:base|com.zfabrik.dev.z2jupiter/java/src.test/com/zfabrik/dev/z2jupiter/test .

If you want to use Z2 Jupiter in your projects for tests implemented under java/src.test, make sure to have the framework referenced in java/z.properties like this:

java.testReferences=\
    com.zfabrik.dev.z2jupiter,\

To see how this works in Eclipse

  1. Follow the "Up in 5 minutes" trail Step_2_-_Install_and_run_in_5_minutes to make sure you understand how to setup z2 and Eclipse.
  2. Create a Z2 Java project my_tests in your Eclipse workspace. Make sure it is armed.
  3. Add a test reference to com.zfabrik.dev.z2jupiter to your Java component, say my_tests/java.
  4. Create a test class in src.test of your Java component like the following:
    package mytest;
    
    import org.junit.jupiter.api.Test;
    
    import com.zfabrik.dev.z2jupiter.Z2JupiterTestable;
    
    @Z2JupiterTestable(componentName="my_tests/java")
    public class AZ2UnitTest {
    
        @Test
        public void someTestMethod() {  
            System.out.println("Hello World!");
        }
    }
    
  5. Resolve using the Eclipsoid plugin (see above)
  6. Right-click and choose Run-As / JUnit Test

Using and Configuring z2Unit outside of the IDE

Note that resolving the dependencies and synchronizing the runtime is an important prerequisite to running a z2Unit Unit Test class. You need to have all dependencies of the test class resolved so that JUnit can resolve the test class locally (although all the action will happen elsewhere) and you need to have synchronized so that the matching definitions are found on the server side.

If you want to automate tests and cannot rely on the Eclipsoid to have a suitable class path, you should use the com.zfabrik.dev.util/jarRetriever tool to retrieve all required dependencies. In that case, you can run Z2 Jupiter tests just as any unit tests also from an ANT script for example. A typical application is to run Z2 Jupiter integration tests as part of your test automation effort.

See in particular How to download jars from Z2 on how to integrate jar retrieving with ANT.

The execution of a Z2 Jupiter test requires the test client, which is the local JUnit runtime invoked by ANT (or your IDE as above) invoking the Z2 Jupiter Test Engine, to connect via HTTP to the Z2 application server. If you run tests on the same operating system instance the application runs on, this works by default by reaching out to localhost. If your application server is on a different machine though, you will want to configure that accordingly.

For example, you could define a different URL when configuring the Z2JupiterTestable annotation.

That is not practical when running test automatically however, as you would not want to change application code for that purpose.

Instead you can specify essentially the same configuration that the Z2JupiterTestable annotation holds by setting any of the system properties or environment variables shown belown before test execution. For example in your ANT script.

Properties that control the behavior of the Z2JupiterTestable, and that may be specified as system properties or via the configuration file are shown in the following table:

Property Name Environment Variable Property Meaning
com.zfabrik.dev.z2jupiter.url Z2_JUPITER_URL URL to send the test request to. Defaults to http://localhost:8080/z2unit.jupiter/run.

References

Read on in the Javadocs. for more details.

Updated by Henning Blohm over 3 years ago · 8 revisions