Page History
...
Using Frameworks for Unit Tests
Most people will It is worthwhile to learn how to use a testing framework. Psana developers are encouraged to use unittest for Python, and boost::unit_test for C++ in order to be consistent with existing tests in the release. However this is not necessary. 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 Below is an example of using the Python unit test framework would beunittest with Python. Add the file MyPkg/test/using_python_framework with the following content:
Code Block | ||
---|---|---|
| ||
#!@PYTHON@ import sys import unittest class MyTest( unittest.TestCase ) : def setUp(self) : """ Method called to prepare the test fixture. This is called immediately before calling the test method; any exception raised by this method will be considered an error rather than a test failure. """ pass def tearDown(self) : """ Method called immediately after the test method has been called and the result recorded. This is called even if the test method raised an exception, so the implementation in subclasses may need to be particularly careful about checking internal state. Any exception raised by this method will be considered an error rather than a test failure. This method will only be called if the setUp() succeeds, regardless of the outcome of the test method. """ pass def test_mytest(self): a=3 b=4 self.assertEqual(a,b) if __name__ == '__main__': unittest.main(argv=[sys.argv[0], '-v']) |
after doing scons test, you will get failure, and see . After looking at the utest output file, one will find
Code Block |
---|
******************************************************************************************************** *** Unit test failed, check log file build/x86_64-rhel5-gcc41-opt/MyPkg/using_python_framework.utest *** ******************************************************************************************************** scons: *** [build/x86_64-rhel5-gcc41-opt/MyPkg/using_python_framework.utest] Error 256 scons: building terminated because of errors. psana1302:~/rel/unitTestTutorial $ cat build/x86_64-rhel5-gcc41-opt/MyPkg/using_python_framework.utest test_mytest (__main__.MyTest) ... FAIL ====================================================================== FAIL: test_mytest (__main__.MyTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "build/x86_64-rhel5-gcc41-opt/MyPkg/using_python_framework", line 31, in test_mytest self.assertEqual(a,b) AssertionError: 3 != 4 ---------------------------------------------------------------------- Ran 1 test in 0.000s FAILED (failures=1) |
Refer to the documentation https://docs.python.org/2/library/unittest.html for more information on unittest.
Boost unit_test Framework
exa,
For an example of using the boost C++ unit test framework, create the file MyPkg/test/using_boost_framework.cpp with the contents (this is mostly copied from the boost website:
Code Block | ||
---|---|---|
| ||
#define BOOST_TEST_MODULE MyTest
#include <boost/test/included/unit_test.hpp>
/**
* Simple test suite for module psevt-unit-test.
* See http://www.boost.org/doc/libs/1_36_0/libs/test/doc/html/index.html
*/
#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>
int add( int i, int j ) { return i+j; }
BOOST_AUTO_TEST_CASE( my_test )
{
// seven ways to detect and report the same error:
BOOST_CHECK( add( 2,2 ) == 4 ); // #1 continues on error
BOOST_REQUIRE( add( 2,2 ) == 4 ); // #2 throws on error
if( add( 2,2 ) != 4 )
BOOST_ERROR( "Ouch..." ); // #3 continues on error
if( add( 2,2 ) != 4 )
BOOST_FAIL( "Ouch..." ); // #4 throws on error
if( add( 2,2 ) != 4 ) throw "Ouch..."; // #5 throws on error
BOOST_CHECK_MESSAGE( add( 2,2 ) == 4, // #6 continues on error
"add(..) result: " << add( 2,2 ) );
BOOST_CHECK_EQUAL( add( 2,2 ), 4 ); // #7 continues on error
}
BOOST_AUTO_TEST_CASE( my_test_fail )
{
BOOST_CHECK_EQUAL( add( 2,2 ), 5 );
} |
The second test is designed to fail, and the output in the .utest file is
Code Block |
---|
psana1302:~/rel/unitTestTutorial $ cat build/x86_64-rhel5-gcc41-opt/MyPkg/using_boost_framework.utest
Running 2 test cases...
MyPkg/test/using_boost_framework.cpp(38): error in "my_test_fail": check add( 2,2 ) == 5 failed [4 != 5] |
#define BOOST_TEST_MODULE MyTest
#include <boost/test/included/unit_test.hpp>
/**
* Simple test suite for module psevt-unit-test.
* See http://www.boost.org/doc/libs/1_36_0/libs/test/doc/html/index.html
*/
#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>
int add( int i, int j ) { return i+j; }
BOOST_AUTO_TEST_CASE( my_test )
{
// seven ways to detect and report the same error:
BOOST_CHECK( add( 2,2 ) == 4 ); // #1 continues on error
BOOST_REQUIRE( add( 2,2 ) == 4 ); // #2 throws on error
if( add( 2,2 ) != 4 )
BOOST_ERROR( "Ouch..." ); // #3 continues on error
if( add( 2,2 ) != 4 )
BOOST_FAIL( "Ouch..." ); // #4 throws on error
if( add( 2,2 ) != 4 ) throw "Ouch..."; // #5 throws on error
BOOST_CHECK_MESSAGE( add( 2,2 ) == 4, // #6 continues on error
"add(..) result: " << add( 2,2 ) );
BOOST_CHECK_EQUAL( add( 2,2 ), 4 ); // #7 continues on error
}
BOOST_AUTO_TEST_CASE( my_test_fail )
{
BOOST_CHECK_EQUAL( add( 2,2 ), 5 );
}