You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

Introduction

The analysis release build system, SConsTools, provides a mechanism for integrating unit tests. Each package in the release, or a package that a user is developing, can have its own tests. All tests can be run by a simple command. Users may find this useful for testing their packages. For packages that psana developers add to the analysis release, these tests are automatically run during the nightly build. This page is primarily for psana developers, to go over how to add unit tests to test packages in the release during nightly builds. There are special considerations to make for tests that are part of the nightly build discussed below.

Example

As an example, lets make a package with both a Python and a C++ unit test. For the example below, I am starting from the directory rel in my home directory. I make a new release, a new package in the release, and the crucial step is that I make a subdirectory called test in my package:

psanacs051:~/rel $ newrel ana-current unitTestTutorial
psanacs051:~/rel $ cd unitTestTutorial/
psanacs051:~/rel/unitTestTutorial $ sit_setup
psanacs051:~/rel/unitTestTutorial $ newpkg MyPkg
psanacs051:~/rel/unitTestTutorial $ mkdir MyPkg/test

Now when one does

scons test

You are building and running the test target. SConsTools will look in the test subdirectory for all packages. It looks for unit tests in these test subdirectories. It looks for:

  • Any file without an extension is treated as a test script. This script will be installed and run.
  • Any file with a .cpp extension is treated as a C++ test program. It will be compiled, installed, and run.
  • If a test script or program returns non-zero, it failed and scons will report this. 

Simple Examples

Below we go over a few simple examples of unit tests.

Python Unit Test

Add the file MyPkg/test/myfirst

#!@PYTHON@
import sys
if __name__ == '__main__':
print "Running my test."
sys.exit(1)

When you do scons test, you will get the output

Running UnitTest: "build/x86_64-rhel5-gcc41-opt/MyPkg/myfirst"
************************************************************************************
*** Unit test failed, check log file build/x86_64-rhel5-gcc41-opt/MyPkg/myfirst.utest ***
************************************************************************************
If you cat the .utest output file you see your output.

The syntax @PYTHON@ is explaied in the SConsTools page.

C++ Unit Test

A simple C++ test would like this, create the file MyPkg/test/mysecond.cpp

#include <iostream>
int main() {
std::cout << "Cpp test" << std::endl;
return -1;
}

This test will also fail. Note, scons test stops after the first test fails.

Using Frameworks for Unit Tests

Most people will use a framework for unit tests. You can use whatever framework you like. We have been using the standard Python unit test module, as well as the boost unit test package. 

Python unittest Framework

An example using the Python unit test framework would be

 

 

 

 

 

  • No labels