Title: Running Unit Tests

## Running Unit Tests

Cayenne provides a comprehensive suite of unit tests. To execute unit tests
you must first get Cayenne from Git, install JDK 1.7 and obtain the latest
Maven.

### Prerequisites

Maven [build prerequisites and recommended settings](/dev/building-cayenne.html) apply here.    
    
### Running Against Embedded HSQLDB
    
No extra setup is required. Just run Maven:
    
    $ cd cayenne
    $ mvn install

or 

    $ cd cayenne
    $ mvn clean verify
    
### Running Against In-memory Database
 
Besides HSQLDB mentioned above Cayenne has preconfigured connection information for 
following databases that support in-memory mode:
   
* derby
* h2
* sqlite

For this databases you can run tests without any additional configuration by only specifying
*cayenneTestConnection* property that will activate required Maven profile:
 
    $ mvn verify -DcayenneTestConnection=derby    
    
### Running Against Database in Docker (only on Linux)

Another handy option to run Cayenne tests is with preconfigured docker profiles.
The only thing you need is to install Docker.

You can run tests with following *cayenneTestConnection* properties:
 
    $ mvn verify -DcayenneTestConnection=mysql-docker
or
    
    $ mvn verify -DcayenneTestConnection=postgres-docker    
    
### Running Against a Specific Database

Final option to run tests against any supported database is with manual configuration. 
    
#### Step 1. Install JDBC Driver Jars in a Local Maven Repo
    
Most commercial drivers are not present in the public Maven repositories.
So they have to be installed by the tester locally. The group and artifact
ids are arbitrarily assigned in the main Cayenne POM, so users must follow
the POM or the examples below.
    
**FrontBase:**

    $ mvn install:install-file -Dfile=frontbasejdbc.jar -DgroupId=com.frontbase \
           -DartifactId=frontbase-driver -Dversion=4.1 -Dpackaging=jar -DgeneratePom=true

**OpenBase:**

    $ mvn install:install-file -Dfile=OpenBaseJDBC.jar -DgroupId=com.openbase \
           -DartifactId=openbase-driver -Dversion=9 -Dpackaging=jar -DgeneratePom=true
    
**Oracle:**

    $ mvn install:install-file -Dfile=ojdbc5.jar -DgroupId=com.oracle \
           -DartifactId=oracle-driver -Dversion=11 -Dpackaging=jar -DgeneratePom=true

**SQLServer:**

    $ mvn install:install-file -Dfile=sqljdbc4.jar -DgroupId=com.microsoft \
           -DartifactId=sqlserver-driver -Dversion=4.0 -Dpackaging=jar -DgeneratePom=true

**Sybase:**

    $ mvn install:install-file -Dfile=jconn3.jar -DgroupId=com.sybase \
           -DartifactId=sybase-driver -Dversion=12 -Dpackaging=jar -DgeneratePom=true
    
#### Step 2. Run Tests Against Configured Data Source
    
Database type and connection information can be specified either on the
command line or via a configuration file. First let's look at the command
line options:
    
    $ mvn verify -DcayenneTestConnection=<profile_name> \
       -DcayenneAdapter=org.apache.cayenne.dba.mysql.MySQLAdapter \
       -DcayenneJdbcUsername=myuser \
       -DcayenneJdbcPassword=mypassword \
       -DcayenneJdbcUrl=jdbc:mysql://localhost/cayenne \
       -DcayenneJdbcDriver=com.mysql.jdbc.Driver

*cayenneTestConnection* is a property activating a DB-specific Maven
profile. *<profile_name>* can be one of:

* db2
* derby
* firebird
* frontbase
* h2
* ingres
* mysql
* openbase
* oracle
* postgres
* sqlite
* sqlserver
* sybase

Another way to store this information permanently for each profile is to
create a directory *$HOME/.cayenne/* and place a file called
*connection.properties* in this directory. File contents should be
similar to this example:

    mysql.cayenne.adapter = org.apache.cayenne.dba.mysql.MySQLAdapter
    mysql.jdbc.username = someuser
    mysql.jdbc.password = somepasswd
    mysql.jdbc.url = jdbc:mysql://mysql.host:3306/test_db?useUnicode=true&characterEncoding=UTF-8&generateSimpleParameterMetadata=true
    mysql.jdbc.driver = com.mysql.jdbc.Driver
    
    oracle.cayenne.adapter = org.apache.cayenne.dba.oracle.OracleAdapter
    oracle.jdbc.username = someuser
    oracle.jdbc.password = somepasswd
    oracle.jdbc.url = jdbc:oracle:thin:@//oracle.host:1521/XE
    oracle.jdbc.driver = oracle.jdbc.driver.OracleDriver
    
    postgres.adapter = org.apache.cayenne.dba.postgres.PostgresAdapter
    postgres.jdbc.username = someuser
    postgres.jdbc.password = somepasswd
    postgres.jdbc.url = jdbc:postgresql://postgresql.host:5432/test_db
    postgres.jdbc.driver = org.postgresql.Driver
    
    db2.adapter = org.apache.cayenne.dba.db2.DB2Adapter
    db2.jdbc.username = someuser
    db2.jdbc.password = somepasswd
    db2.jdbc.url = jdbc:db2://db2.host:50000/test_db
    db2.jdbc.driver = com.ibm.db2.jcc.DB2Driver
    
Each property starts with the Maven profile name ("mysql" and "oracle" in
the example above). Note that in this case you should still use
*cayenneTestConnection*. E.g.:
    
    $ mvn verify -DcayenneTestConnection=mysql