Testing code changes

Automated tests

The Bio-Formats testing framework component contains most of the infrastructure to run automated tests against the data repository.

After checking out source code and building all the JAR files (see Obtaining and building Bio-Formats), switch to the test-suite component and run the tests using the ant test-automated target:

$ cd components/test-suite
$ ant -Dtestng.directory=$DATA/metamorph -Dtestng.configDirectory=$CONFIG/metamorph test-automated

where $DATA is the path to the full data repository and $CONFIG is the path to the configuration repository.

Multiple options can be passed to the ant test-automated target by setting the testng.${option} option via the command line. Useful options are described below.

testng.directory

Mandatory option. Specifies the root of the data directory to be tested:

$ ant -Dtestng.directory=$DATA/metamorph -Dtestng.configDirectory=$CONFIG/metamorph test-automated

On Windows, the arguments to the test command must be quoted:

> ant "-Dtestng.directory=$DATA\metamorph" "-Dtestng.configDirectory=$CONFIG\metamorph" test-automated
testng.configDirectory

Mandatory option. Specifies the root of the directory containing the configuration files. This directory must have the same hierarchy as the one specified by testng.directory and contain .bioformats configuration files:

$ ant -Dtestng.directory=/path/to/data -Dtestng.configDirectory=/path/to/config test-automated
testng.configSuffix

Specifies an optional suffix for the configuration files:

$ ant -Dtestng.directory=/path/to/data -Dtestng.configSuffix=win test-automated
testng.memory

Specifies the amount of memory to be allocated to the JVM:

$ ant -Dtestng.directory=$DATA -Dtestng.memory=4g test-automated

Default: 512m.

testng.threadCount

Specifies the number of threads to use for testing:

$ ant -Dtestng.directory=$DATA -Dtestng.threadCount=4 test-automated

Default: 1.

You should now see output similar to this:

Buildfile: build.xml

init-title:
     [echo] ----------=========== bio-formats-testing-framework ===========----------
...
test-automated:
   [testng] 17:05:28,713 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [${logback.configurationFile}]
   [testng] 17:05:28,713 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
   [testng] 17:05:28,713 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
   [testng] 17:05:28,713 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/opt/ome/bioformats/components/test-suite/logback.xml]
   [testng] 17:05:28,835 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
   [testng] 17:05:28,837 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [stdout]
   [testng] 17:05:28,876 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.classic.sift.SiftingAppender]
   [testng] 17:05:28,878 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [SIFT]
   [testng] 17:05:28,891 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [loci.tests.testng] to DEBUG
   [testng] 17:05:28,891 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to INFO
   [testng] 17:05:28,891 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [SIFT] to Logger[ROOT]
   [testng] 17:05:28,892 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [stdout] to Logger[loci.tests.testng]
   [testng] 17:05:28,892 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
   [testng] 17:05:28,894 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@706a04ae - Registering current configuration as safe fallback point
   [testng] [2015-08-18 17:05:28,904] [main] testng.directory = /ome/data_repo/test_per_commit/
   [testng] 17:05:28,908 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [loci.tests.testng.TimestampedLogFileAppender]
   [testng] 17:05:28,909 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [logfile-main]
   [testng] 17:05:28,955 |-INFO in loci.tests.testng.TimestampedLogFileAppender[logfile-main] - File property is set to [target/bio-formats-test-main-2015-08-18_17-05-28.log]
   [testng] [2015-08-18 17:05:28,963] [main] testng.multiplier = 1.0
   [testng] [2015-08-18 17:05:28,964] [main] testng.in-memory = false
   [testng] [2015-08-18 17:05:28,964] [main] user.language = en
   [testng] [2015-08-18 17:05:28,964] [main] user.country = US
   [testng] [2015-08-18 17:05:28,964] [main] Maximum heap size = 455 MB
   [testng] Scanning for files...
   [testng] [2015-08-18 17:05:32,258] [main] ----------------------------------------
   [testng] [2015-08-18 17:05:32,258] [main] Total files: 480
   [testng] [2015-08-18 17:05:32,258] [main] Scan time: 3.293 s (6 ms/file)
   [testng] [2015-08-18 17:05:32,258] [main] ----------------------------------------
   [testng] Building list of tests...

and then eventually:

   [testng] ===============================================
   [testng] Bio-Formats software test suite
   [testng] Total tests run: 19110, Failures: 0, Skips: 0
   [testng] ===============================================
   [testng]

BUILD SUCCESSFUL
Total time: 16 minutes 42 seconds

In most cases, test failures should be logged in the main console output as:

[testng] [2015-08-18 17:13:13,625] [pool-1-thread-1]     SizeZ: FAILED (Series 0 (expected 2, actual 1))

To identify the file, look for the initialization line preceding the test failures under the same thread:

[testng] [2015-08-18 17:13:12,376] [pool-1-thread-1] Initializing /ome/data_repo/test_per_commit/ome-tiff/img_bk_20110701.ome.tif:

The console output is also recorded under components/test-suite/target as bio-formats-software-test-main-$DATE.log where “$DATE” is the date on which the tests started in “yyyy-MM-dd_hh-mm-ss” format. The detailed report of each thread is recorded under bio-formats-software-pool-$POOL-thread-$THREAD-main-$DATE.log

Configuration files can be generated for files or directories using the ant gen-config target. This generation target supports the same options as ant test-automated:

$ ant -Dtestng.directory=/path/to/data -Dtestng.configDirectory=/path/to/config -Dtestng.memory=4g -Dtestng.threadCount=6 gen-config

MATLAB tests

Tests for the Bio-Formats MATLAB toolbox are written using the xunit framework and are located under https://github.com/ome/bioformats/tree/develop/components/formats-gpl/test/matlab.

To run these tests, you will need to download or clone matlab-xunit, a xUnit framework with JUnit-compatible XML output. Then add this package together with the Bio-Formats MATLAB to your MATLAB path:

% Add the matlab-xunit toolbox to the MATLAB path
addpath('/path/to/matlab-xunit');
% Add the Bio-Formats MATLAB source to the MATLAB path
% For developers working against the source code
addpath('/path/to/bioformats/components/formats-gpl/matlab');
addpath('/path/to/bioformats/artifacts');
% For developers working against a built artifact, e.g. a release
% addpath('/path/to/bfmatlab');

You can run all the MATLAB tests using runxunit:

cd /path/to/bioformats/components/formats-gpl/test/matlab
runxunit

Individual test classes can be run by passing the name of the class:

cd /path/to/bioformats/components/formats-gpl/test/matlab
runxunit TestBfsave

Individual test methods can be run by passing the name of the class and the name of the method:

cd /path/to/bioformats/components/formats-gpl/test/matlab
runxunit TestBfsave:testLZW

Finally, to output the test results under XML format, you can use the -xmlfile option:

cd /path/to/bioformats/components/formats-gpl/test/matlab
runxunit -xmlfile test-output.xml