さくらんぼのlambda日記

lambdaちっくなことからゲーム開発までいろいろ書きます。

テストしたい

やっとインターネットが繋がったので各種環境の更新をしてて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

わーい。実行できたー。

まとめ

どうやら
boost::testしたいなら

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>

して使うのが良さそうです。
ちなみに、静的リンクだとどうもうまく動作してくれなかったので何か別の方法があるのかもしれません。
BOOST_TEST_DYN_LINKを外してしまうとSegmentation faultが発生してしまいました....。