blob: 61820454f9fcd3a4e962694172952546f9b54b2b [file] [log] [blame]
Best practices of writing tests
1) TESTS:
Tests are written under version they apply to. For e.g. all tests related to
v2 should be written under v2/test
The test folder is broken down into
a) src
b) cases
c) tools
Below are the uses for each of the folders.
a) Src:
This is where the actual test cases (in this case junit driver) live. The src
folder is divided by functional areas at the highest level.
Each functional area is further sub divided by smaller functional areas (if
required). If the division is not required then functional area is divided
by importance of the tests. Importance are of 2 types
a) Checkin
b) Detailed.
As the names suggest checkin tests are really important tests for a particular
area while Detailed tests aim is to test more of edge cases/error condition/
various kinds of input etc.
Not each top-level functional area needs to have checkin folder. If that area
is not that widely used in the product there might just be detailed folder.
Since checkin tests have to be run by all developer every time they checkin
the goal is to include the most crucial tests for each functional area of
the product.
Also each top level/sub functional area can have a Common folder. The main
goal here is group smaller utilities used to test functional area in one
place so that both the Checkin/Detailed tests can use. If you feel the tools
you are writing can be share across Cross-functional areas then use the Tools
folder (more to come later in the doc). Any class which is not itself a Junit
test should go into that folder, even if it is a superclass for a Junit test
in the checkin/detailed folder. Same goes for all interfaces.
Below is an e.g. of how one of the top-level functional area's directory
structure may look like.
xmlcursor/
|-checkin/
|-detailed/
|-common/
|-saver/
| |-detailed/
| |-common/
|-xpath/
| |-checkin/
| |-detailed/
| |-common/
In this e.g. the xmlcursor area is broken down by checkin/detailed tests for
smaller functionality that is cursor specific. For functionality in the
cursor that is bigger sub folders are created with its own checkin/detailed/
common areas. Again saver does not have a checkin folder since the tests in
this area are not too important.
Overall when writing a test please consider which areas they fit and only
create sub folder/top level folders only if necessary.
2) CASES:
This contains schema files/xml instances belonging to those schemas and schema
independent xml instances which can be shared within the functional areas.
Cases is further divided into top level areas matching src folder and all
schemas/xml instances used by functional areas are placed within this.
All schemas are compiled with scomp during the build process before compiling
the tests. If you have added a top level folder to src then the schemas & xml
instances for those tests should have their top-level folder within cases/xbean.
If these schemas need to be compiled by scomp you will need to edit the
testbuild.xml file to include the new folder in the build. Add this folder
to the variable "schema.dirs". (More details below)
If you are just adding schemas to existing folders within xbean/cases then
these will be automatically picked up in the build process.
If you have schemas that you don't want to pre compile in the build process
please rename the extension from .xsd to .xsddonotcompile. In this way scomp
will not pick up pre compile the schema.
The best practice for the cases folder is to try to reuse schemas within the
functional areas. So please check the schemas we have before adding more schemas.
Since currently the directory structure is such that process sharing of
schemas exists within top level functional areas (e.g. all tests with
xmlcursor can reuse the schemas) there is some amount of duplication since
schemas are not shared among top level functional areas. (for e.g. xmlcursor
& xmlobject will not have schemas shared among them). Though we recognize this
and are making attempts to revise the directory structure this has
implications on how the tests run so for the immediate future this might stay
as it is.
3) TOOLS:
The tools area is meant for storing tools/utilities which help running the
tests and reporting results. If you feel you have written a tool which could
be used across all functional areas please put the source within tools/src.
However before adding a tool please check the existing tools which we already
have.
4) BUILD FILE CHANGES:
Depending on how tests and cases are added, the build file (testbuild.xml)
will need to be updated.
a) New folder containing schemas added to cases:
Append this folder to the property schema.dirs
e.g:
Old value:
<property name="schema.dirs"
value="${build.dir.test.schemas}/xbean/xmlcursor"/>
New value:
<property name="schema.dirs"
value="${build.dir.test.schemas}/xbean/xmlcursor,
${build.dir.test.schemas}/xbean/NEWAREA"/>
If your schemas are needed in order to run checkintests please update the
"checkin.schema.dirs" property as well.
b) New top-level area added to test (src/NEWAREA)
Add this folder to the list of areas for incremental compile
* Append the area name to the property area.names
* Add a new target with the name "build.area.NEWAREA"
Properties that need to be set for this target to work
* includes.for.compile - includes spec for javac
Optionally set the following properties
* this.schema.dirs - list of folders for scomp
* this.schema.standalone.dirs - list of individual schemas for scomp
* testcasesjar.update - set to true if testcases.jar should be
updated instead of overwriting
Add a call to target "unit.build" at the end of the target.
e.g:
<target name="build.area.xmlcursor">
<property name="this.schema.dirs"
value="${build.dir.test.schemas}/xbean/xmlcursor"/>
<property name="includes.for.compile"
value="**/xmlcursor/**/*.java"/>
<property name="testcasejar.update" value="true"/>
<antcall target="unit.build"/>
</target>