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>










