テストしたい
やっとインターネットが繋がったので各種環境の更新をしててboostの更新とかも行ったのですが、その時にどうやらboost::testが使えなくなっていたのでどういうことなのか調べました...。
テストの例として、Let's boostにあったテストのコード(下記)を実行してみました。
#include <vector> #include <boost/test/included/unit_test.hpp> using namespace std; // // STLのvectorクラステンプレートのテストコードを書いてみました。 // BOOST_AUTO_TEST_CASE( push_back_test ) { vector<int> v; BOOST_CHECK( v.empty() ); BOOST_CHECK_EQUAL( v.size(), 0 ); v.push_back( 1 ); v.push_back( 2 ); BOOST_CHECK( !v.empty() ); BOOST_CHECK_EQUAL( v.size(), 2 ); BOOST_CHECK_EQUAL( v.front(), 1 ); BOOST_CHECK_EQUAL( v.back(), 2 ); } BOOST_AUTO_TEST_CASE( at_test ) { vector<char> vi( 100, 'a' ); BOOST_CHECK_THROW( vi.at(100), std::exception ); } BOOST_AUTO_TEST_CASE( construct_test ) { vector<int> vi( 100, 3 ); BOOST_CHECK_EQUAL( vi.size(), 100 ); BOOST_CHECK_EQUAL( vi[10], 3 ); vector<double> vd( vi.begin(), vi.end() ); BOOST_CHECK_EQUAL( vd.size(), 100 ); BOOST_CHECK_EQUAL( vd[99], 3.0 ); }
実行結果
[sakura@sakura-no-macbook.local] $ g++ test.cc -lboost_unit_test_framework Undefined symbols: "_main", referenced from: start in crt1.10.6.o ld: symbol(s) not found
えー。以前はこれで動作したのに.....。
なんか発見
色々ネットをあさっていると
https://bugs.launchpad.net/ubuntu/+source/boost/+bug/162155
こんな記事がありました....。
The boost documentation is outdated. Please read
/usr/include/boost/test/unit_test.hpp
which defines "main" (i.e. it is not a real symbol in the lib*.so).
You will find the requirement for two precompiler defines
if defined(BOOST_TEST_DYN_LINK) && defined(BOOST_TEST_MAIN)
.....しるかーーーーーーーーーーーーーー。
ソース嫁っていうのはちょっとひどいwwwww
で、ソースの先頭に
#define BOOST_TEST_DYN_LINK #define BOOST_TEST_MAIN
をつけて再度コンパイル!
[sakura@sakura-no-macbook.local] $ g++ test.cc -lboost_unit_test_framework [~] [sakura@sakura-no-macbook.local] $
コンパイルできたー!
さて実行
[sakura@sakura-no-macbook.local] $ ./a.out Running 3 test cases... zsh: segmentation fault ./a.out
ええええええええええええええええ。
うーんうーん。
もしやとおもってインクルードするファイルを変更してみる
#include <boost/test/unit_test.hpp> // こっちをインクルードするように変更 //#include <boost/test/included/unit_test.hpp> // こっちはインクルードしない
すると
[sakura@sakura-no-macbook.local] $ ./a.out [~] Running 1 test case... *** No errors detected
わーい。実行できたー。