web-dev-qa-db-ja.com

Boost.Test:実用的な非簡易テストスイートの例/チュートリアルを探す

Boost.Testのドキュメント と例には実際には重要な例が含まれていないようで、これまでに見つけた2つのチュートリアル herehere 役立つ一方で、どちらもかなり基本的なものです。

独立して実行できるユニットテストとフィクスチャのモジュールごとのスイートを維持しながら、プロジェクト全体のマスターテストスイートが欲しいです。また、モックサーバーを使用して、さまざまなネットワークエッジのケースをテストします。

私はUbuntu 8.04を使用していますが、とにかく自分のメイクファイルを作成しているので、LinuxまたはWindowsの例を取り上げます。

編集

テストとして、次のことを行いました。

// test1.cpp
#define BOOST_TEST_MODULE Regression
#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(test1_suite)

BOOST_AUTO_TEST_CASE(Test1)
{
    BOOST_CHECK(2 < 1);
}

BOOST_AUTO_TEST_SUITE_END()

// test2.cpp
#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(test2_suite)

BOOST_AUTO_TEST_CASE(Test1)
{
    BOOST_CHECK(1<2);
}

BOOST_AUTO_TEST_SUITE_END()

次に、それをコンパイルします:g++ test1.cpp test2.cpp -o tests

これにより、リンク時に発生する膨大な数の「複数の定義」エラーが発生します。

すべてが1つのファイルに収まっている場合は問題なく動作します。

34

Boost.TestによるC++ユニットテスト

(永続的なリンク: http://web.archive.org/web/20160524135412/http://www.alittlemadness.com/2009/03/31/c-unit-testing-with-boosttest/ =)

上記は素晴らしい記事であり、実際のBoostのドキュメントよりも優れています。

編集:

また、クラス名のリストからメイクファイルとプロジェクトのスケルトンを自動生成するPerlスクリプトも作成しました。これには、「オールインワン」テストスイートと各クラスのスタンドアロンテストスイートの両方が含まれます。これは makeSimple と呼ばれ、Sourceforge.netからダウンロードできます。

基本的な問題であることがわかったのは、テストを複数のファイルに分割したい場合、コンパイル済みのテストランタイムに対してリンクし、Boost.Testの「ヘッダーのみ」バージョンを使用しないことです。各ファイルに#define BOOST_TEST_DYN_LINKを追加する必要があります。たとえば、Boostヘッダーを含める場合は、<boost/test/unit_test.hpp>ではなく<boost/test/included/unit_test.hpp>を使用します。

したがって、単一のテストとしてコンパイルするには:

g++ test_main.cpp test1.cpp test2.cpp -lboost_unit_test_framework -o tests

または個別のテストをコンパイルするには:

g++ test1.cpp -DSTAND_ALONE -lboost_unit_test_framework -o test1

// test_main.cpp
#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE Main
#include <boost/test/unit_test.hpp>

// test1.cpp
#define BOOST_TEST_DYN_LINK
#ifdef STAND_ALONE
#   define BOOST_TEST_MODULE Main
#endif
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(test1_suite)

BOOST_AUTO_TEST_CASE(Test1)
{
    BOOST_CHECK(2<1);
}

BOOST_AUTO_TEST_SUITE_END()

// test2.cpp
#define BOOST_TEST_DYN_LINK
#ifdef STAND_ALONE
#   define BOOST_TEST_MODULE Main
#endif
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(test2_suite)

BOOST_AUTO_TEST_CASE(Test1)
{
    BOOST_CHECK(1<2);
}

BOOST_AUTO_TEST_SUITE_END()
45

後のチュートリアルの内容以外に本当に必要なものはわかりません。私は必要なすべてをそのようにしてきました。あなたの説明もよくわかりません。

テストプログラムに複数の.cppファイルを含める機能が必要になる場合があります。これは、これらの.cppファイルの1つでBOOST_TEST_MODULEを定義するだけの簡単なものです。すべてのテストプログラムに "driver.cpp"ファイルがあり、それを定義し、ユニットテストヘッダーを含めています。残りのすべての.cppファイル(モジュールまたは概念でスコープ)には単体テストヘッダーのみが含まれ、それらはその変数を定義しません。

両方を一緒にコンパイルして別々にコンパイルできるようにする場合は、独自の-D変数を使用してBOOST_TEST_MODULEを定義するかどうかを指定できます。

一連のテストプログラムを1回の実行で実行してレポートを取得する方法を探している場合は、テストを実行するautomakeメソッド、さらにはCMakeメソッド(CTest)を確認できます。あなたが主張するならば、あなたはあなた自身のmakefileからCTestを使うことができることを確信してください。

8
Edward Strange

Boost.Testから始める場合、ソースコードを含む次の記事は非常に役に立ちました。 Boostテストのセットアップと使用法

3
Hindu