2013-06-04 9 views
11

BOOST単体テストをスキップするにはどうすればよいですか?私は、私がそれらを実行しているプラ​​ットフォーム(例えば)に応じて、私のプログラムの一部をスキップしたいと思います。現在のソリューションは、BOOST単体テストをスキップする方法は?

#define REQUIRE_LINUX char * os_cpu = getenv("OS_CPU"); if (os_cpu != "Linux-x86_64") return; 

BOOST_AUTO_TEST_CASE(onlylinux) { 
    REQUIRE_LINUX 
    ... 
    the rest of the test code. 
} 

です(ビルド環境で変数OS_CPUが設定されています)。これは醜くエラーが発生しやすく、サイレントスキップのようにユーザーがテストをスキップする可能性があります。

任意のロジックに基づいてブーストユニットテストをきれいにスキップできますか?

答えて

2

スキップしないで登録するのを防ぐことができます。 はあなたがboost.testの手動テストの登録を使用することができることを達成するために:

#include <boost/test/included/unit_test.hpp> 
using namespace boost::unit_test; 

//____________________________________________________________________________// 

void only_linux_test() 
{ 
    ... 
} 

//____________________________________________________________________________// 

test_suite* 
init_unit_test_suite(int argc, char* argv[]) 
{ 
    if(/* is linux */) 
     framework::master_test_suite(). 
      add(BOOST_TEST_CASE(&only_linux_test)); 

    return 0; 
} 

は、より多くの情報

ためhttp://www.boost.org/doc/libs/1_53_0/libs/test/doc/html/utf/user-guide/test-organization/manual-nullary-test-case.htmlを参照してください別の可能性がBOOST_AUTO_TEST_CASEでの#ifdef ... #endifのを使用することです。 ターゲットプラットフォームでコードをコンパイルする場合に定義される定義が必要です。

#ifdef PLATFORM_IS_LINUX 

BOOST_AUTO_TEST_CASE(onlyLinux) 
{ 
    ... 
} 
#endif 

この定義は、たとえば、ビルド環境によって設定できます。

+0

私は、これらの基準のいくつかは、実行時に決定されなければならない、ifdefsを使用することはできません。私はおそらくあなたの登録提案のようなものを使用します、ありがとう。 – dbn

3

手動でテストケースを登録するのは退屈で、エラーが発生しやすいです。テストケースを区別する必要があるのはプラットフォームだけであれば、ビルドシステムを構成することによって重要でないプラットフォームで、無関係なテストケースをコンパイルしないだけです。あるいは、Boost.Predefを使用して、特定のテストを#ifdefで実行できるOS、コンパイラなどについて知りたいことがあるすべての必要なプリプロセッサシンボルを定義することができます。

最後に、この基準を実行時にしか知ることができず、実行しているプラ​​ットフォームと独立している場合は、特定の条件に依存するテストをスイートにグループ化し、ビルドで使用されるコマンドラインを調整しますランタイム条件に基づいてそれらのスイートのみを実行します。

4

enable_if/enable/preconditionデコレータを使用します。

boost::test_tools::assertion_result is_linux(boost::unit_test::test_unit_id) 
{ 
    return isLinux; 
} 


BOOST_AUTO_TEST_SUITE(MyTestSuite) 

BOOST_AUTO_TEST_CASE(MyTestCase, 
        * boost::unit_test::precondition(is_linux)) 
{...} 

事前条件は、実行時に評価され、コンパイル時にenable_ifが有効になります。

参照:http://www.boost.org/doc/libs/1_61_0/libs/test/doc/html/boost_test/tests_organization/enabling.html

+0

素晴らしい!これはまさに私が探していたものです。私はいくつかのテストでそれを確認します。 – dbn

+0

@Horus、前提条件で器具を使用する方法はありますか? – mojo

+0

@mojo私のコードhttps://github.com/precice/precice/blob/develop/src/testing/Testing.hppをご覧ください。私はテストツリーからテストを削除するためにデコレータを使用しますが、それも備品のために働くかもしれません。私のコードは非公式のboost APIを使用している可能性があります。 – Horus

1

BOOST_AUTO_TEST_CASE(a_test_name,*boost::unit_test::disabled())

{ 
    ... 
} 
+0

ドキュメントでこの2番目のパラメータが見つかりません。利用可能なのですか? – moodboom

+0

全くあります。http://www.boost。org/doc/libs/1_65_1/libs/test/doc/html/boost_test/tests_organization/enabling.html – Sergei

+0

ありがとうございました - そして、私はあなたの2番目のパラメータがdocsへのリンクであることを確認しました。 – moodboom

関連する問題