Tips on writing TestCase for OpenJPA
You are welcome to contribute new test cases. Following are few suggestions and guidelines on how to contribute new test case to OpenJPA repository of 2000 test cases spread across 400 classes.
How to write TestCase for OpenJPA?
...
Tip |
---|
title | Inherit from OpenJPA TestCases |
---|
|
Unit Tests are JUnit Tests. |
...
The base JUnit test case implementation org.junit.TestCase |
...
...
facilitate common initialization steps or configuration settings |
...
...
...
...
inheritance hierarchy is: |
noformatorgjunitframework.TestCase
+-- org.apache.openjpa.persistence.test.PersistenceTestCase
+-- org.apache.openjpa.persistence.test.SingleEMFTestCase
| +-- org.apache.openjpa.persistence.test.SQLListenerTestCase
|
As a test developer, you should inherit your test class from one of the extended TestCases. In general, SingleEMFTestCase is a good candidate |
...
to inherit from. If your test needs to analyze or count number of SQL statements |
...
, SQLListenerTestCase should be your choice. |
...
Tip |
---|
title | Use correct name and package for test case and entity classes |
---|
|
- Test case should be in a separate sub-package of
org.apache.openjpa.persistence. or org.apache.openjpa.persistence.jdbc.
- Test case class names must start with "Test" e.g.
TestEagerFetch
- There are hundreds of testable entity classes. But if your test requires new entity classes, place them in the same package as that of the new Test cases.
|
Setting up the test
...
Tip |
---|
title | setUp() and tearDown() |
---|
|
- OpenJPA TestCases augment the
setUp() method to accept a list of arguments. In this list, you should specify:
|
...
- entity classes used by your test
- the critical configuration properties
|
...
CLEAR_TABLES or DROP_TABLES : these are constants declared in the superclass which clears the existing rows or drops the tables altogether.
- The following is an example
|
...
...
|
noformat Code Block |
---|
public void setUp() throws Exception {
super.setUp(CLEAR_TABLES, |
rowsfromPERSON and ADDRESS tablePersonAddress PersonAddressElection as persistence-capable entity
"openjpa.Multithreaded", "true" |
);, // sets configuration property as name-value |
pair pairs
"openjpa.Log", "SQL=TRACE");
}
|
|
...
- Notice that some configuration parameters can be set in the
setUp() method of test program itself. This is recommended for properties that are important for your test. The non-critical parameters such as database connection properties (unless your test is about some specific aspect of a particular database) are better be specified in META-INF/persistence.xml .
|
...
...
- persistence name can be specified by overwriting the following method:
|
noformat |
---|
protected String getPersistenceUnitName() {
return "test-eager-fetch";
}
|
|
Cleaning Up
...
...
SingleEMFTestCase ensures that tearDown() method deletes all rows for the domain classes involved in your test.
|
...
- You may want the database records to remain for analysis especially when tests are failing. In that case, you may consider suppressing the superclass behavior of
tearDown() by simply nullifying the method as
|
noformat Code Block |
---|
public void tearDown() throws Exception {
// avoids super class to delete all records
}
|
|
Naming Convention
Name your test class and test methods with following guideline in mind
- Test case class names start with "Test" e.g. TestEagerFetch
- Test method names start with "test" e.g. testUpdateHonoursForeignKeyConstraints()
- Be generously descriptive with camel case e.g. TestEagerFetch or testFetchGroupLocking()
- avoid the obvious e.g. TestSelect or testQuery()
Domain classes
Tip |
---|
title | Annotate O-R Mapping |
---|
|
...
|
Prefer annotation over XML Descriptors for O-R Mapping because that helps to |
...
collocate relevant information. Unless, of course, the test is |
...
specific about variations in behavior across annotation and XML Descriptors. |
Tip |
---|
title | Use JUnit assert*() methods |
---|
|
For verification, use many assertion methods provided by JUnit e.g. assertEquals() or assertTrue() rather than depending on printing trace with System.out.println() . If you want to trace generated SQL or other runtime information, use appropriate openjpa.Log property settings. |
Tip |
---|
|
Create a JIRA issue. Refer to the JIRA issue in the comments section of the new test case. |
Tip |
---|
|
Remember to include ASF License header in the comment section of all the new source or resource files. |
Tip |
---|
title | Attach the test to JIRA Issue |
---|
|
Package all the *.java files related to your test case in a JAR file and attach it to JIRA issue you have created. You must check in the radio button Grant license to ASF for inclusion in ASF works that appears near the bottom of Attach File JIRA page. |