Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

Excerpt
hiddentrue

Running and Writing OpenJPA unit tests

Running and Writing Tests with OpenJPA

OpenJPA's unit tests are written using JUnit. For a template for a simple test case, see the code for TestPersistence.java.

...

Once you have downloaded and built OpenJPA (see Building OpenJPA), you can run individual tests using the "test" goal to maven. For example:

Code Block
mvn test -DfailIfNoTests=false -Dtest=TestPersistence
Note

By default Maven will fail if there are no testcases found in any module you build. The examples solve this by specifying -DfailIfNoTests=false but you can also change your personal default by adding the following to ${user.home}/.m2/settings.xml :

Code Block
xml
xml

        <profile>
            <id>enable-no-tests</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <failIfNoTests>false</failIfNoTests>
            </properties>
        </profile>

To get more debugging information (e.g., to see the SQL that is being executed against the database), you can enable trace-level logging from the command line using the "openjpa.loglevelLog" system property. For example:

Code Block
$ mvn test -DfailIfNoTests=false -Dtest=TestPersistence -Dopenjpa.loglevelLog=DefaultLevel=TRACE

[INFO] Scanning for projects...
[INFO] Reactor build order: 
...
690  test  TRACE  [main] openjpa.jdbc.SQL - <t 4261185, conn 3061987> executing prepstmnt 12659709 
   INSERT INTO AllFieldTypes (id, arrayOfStrings, booleanField, byteField, charField, dateField, 
   doubleField, floatField, intField, longField, shortField, stringField) 
   VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [params=(long) 601, (null) null, (int) 0, (byte) 0, 
   (int) 0, (null) null, (double) 0.0, (float) 0.0, (int) 0, (long) 0, (short) 0, (null) null]
701  test  TRACE  [main] openjpa.jdbc.SQL - <t 4261185, conn 3061987> [11 ms] spent
701  test  TRACE  [main] openjpa.jdbc.JDBC - <t 4261185, conn 3061987> [0 ms] commit
702  test  TRACE  [main] openjpa.jdbc.JDBC - <t 4261185, conn 0> [0 ms] close
...
$

Setting additional Log parameters

There are several parameters that are used by OpenJPA Log. Here are some that might be of value when debugging test cases. Note that the logger names are case sensitive while the log levels are not.

  • DefaultLevel sets the level for all loggers that are not otherwise set
  • file sets the file name for logging output
  • Enhance logs messages from the enhancer
  • Metadata logs messages from the metadata processor
  • Tool logs messages from the schema synchronization tool
  • SQL logs messages from the SQL generator
  • JDBC logs messages related to JDBC
  • Schema logs messages related to schema
  • Runtime logs messages related to runtime
  • Query logs messages related to queried
  • DataCache logs messages related to caching

Log levels specify the minimum log message that is output. All log messages with a level higher than the log level set for a logger are output. So if INFO is specified, log messages of level INFO, WARN, ERROR, and SEVERE are output.

  • TRACE
  • INFO
  • WARN
  • ERROR
  • FATAL

For example, to avoid enhancement warnings, get detailed SQL information, and write the log data to a file:

Code Block
mvn test -Dtest=TestPersistence -Dopenjpa.Log=Enhance=ERROR,SQL=TRACE,file=openjpa.log

Testing against alternate databases

By default, OpenJPA uses the Derby database for testing. The openjpa-persistence-jdbc/pom.xml POM declares various pre-defined databases against which tests can be executed. For example, to test against the stand-alone HSQLDB database, you can run with the "test-hsqldb" profile:

Code Block
mvn test -DfailIfNoTests=false -Dtest=TestPersistence -Ptest-hsqldb

For databases that are not in the pre-defined list, you can manually specify connection parameters to use for testing under the "test-custom" profile. You will need to manually provide the driver class and specify all of the connection parameters. For example, to test against Oracle, you might run:

Code Block
mvn test -DfailIfNoTests=false -Dtest=TestPersistence -Ptest-custom \
  -Dopenjpa.custom.driverjar=$(pwd)/drivers/jdbc-oracle-10_2_0_1_0.jar \
  -Dopenjpa.custom.driverclass=oracle.jdbc.driver.OracleDriver \
  -Dopenjpa.custom.url=jdbc:oracle:thin:@HOST:PORT:DBNAME \
  -Dopenjpa.custom.username=USERNAME \
  -Dopenjpa.custom.password=PASSWORD

...

This profile can then be executed by running:

Code Block
mvn test -DfailIfNoTests=false -Dtest=TestPersistence -Ptest-custom,test-oracle

Running JUnits in Eclipse

You'll probably want to setup a Debug Configuration in Eclipse for running the JUnit testcases.

  1. Run --> Debug Configurations... Create a new JUnit configuration
    Image Added
  2. For the Test tab - Give the configuration a Name, select a Project and Test class, and you'll probably want to select the "Keep JUnit running..." option.
    Image Added
  3. For the Arguments tab - Press the Variables... button. This will allow us to define variables that can be shared across other Release/Debug Configurations within this workspace.
    Image Added
  4. For the Select Variable window - Press the Edit Variables... button.
    Image Added
  5. For the Preferences windows - Press New... to add two variables.
    Image Added
    Code Block
    
    Name = openjpa.trace
    Value = -Dopenjpa.Log=DefaultLevel=TRACE
    Description = Set OpenJPA logging to TRACE
    
    Image Added
    Code Block
    
    Name = connect.derby
    Value = -Dopenjpa.ConnectionDriverName=org.apache.derby.jdbc.EmbeddedDriver -Dopenjpa.ConnectionURL=jdbc:derby:target/database/openjpa-derby-database;create=true
    Description = Connection properties for Derby
    
    Image Added
  6. After the above are created and saved, add the new variables as VM Arguments.
    Code Block
    
    ${openjpa.trace}
    ${connect.derby}
    
    Image Added