C ++単体テストフレームワークの比較[終了]


300

C ++単体テストフレームワークの推奨事項に関するいくつかの質問が既にあることを知っていますが、フレームワークの1つを推奨するだけで(機能)比較に関する情報を提供しないため、すべての回答が役に立たなかった。

最も興味深いフレームワークは、CppUnit、Boost、および新しいGoogleテストフレームワークだと思います。誰かがまだ比較を行っていますか?



私は自分のIOCベースのテストフレームワークを持っています。これは、他のすべての作業の単なるクローンではなく、他のすべての問題の発見に対処するため、さらに気に入っています。マクロを使用するのではなく、クラスから派生してテストケースを記述します。マクロはリフレクションを提供するため、アサーションにのみ使用されます。テスト統計のカスタマイズされた出力。IOCスクリプトから実行して、テストする対象、頻度、およびパラメーターを選択します。
CashCow 2014年

また、開発の観点から見れば、自分のテストを追加すると、他の全員のテストを同時に実行しなくても実行できるという点で優れています。だから私は私のコードが機能していることを知っています。
CashCow 2014年

回答:


99

議論については、この質問参照してください

彼らは次の記事を推奨しています: Noel Llopis著、C ++ユニットテストフレームワークジャングルの探索。そして、より新しい:C ++テストユニットフレームワーク

googletestを他のフレームワークと比較する記事はまだ見つかりません。


私が書いたように:すべての回答はフレームワークの1つを推奨するだけで、フレームワークを別のフレームワークと比較しません。
housemaister

あなたも記事に満足していませんか?
岐阜

7
1つの批判:記事は良いものの、2004年のものであり、Google Testは含まれていません。
richq 2008年

2
最初のリンクには、2つの比較があります。グーグルからの新しいフレームワークを除いて、ほとんどの情報はまだ(ありますか?)まだ関連しています。(そしてCppUnitは最も興味深いものではありません、それは使うのが
面倒です

1
リンクを修正し、より最近の比較で回答を拡張しました
Sam Saffron '28

120

新しいプレーヤーはGoogle TestGoogle C ++ Testing Frameworkとも呼ばれます)ですが、これはかなり優れています。

#include <gtest/gtest.h>

TEST(MyTestSuitName, MyTestCaseName) {
    int actual = 1;
    EXPECT_GT(actual, 0);
    EXPECT_EQ(1, actual) << "Should be equal to one";
}

主な特徴:

  • ポータブル
  • 致命的および非致命的なアサーション
  • 簡単なアサーション情報メッセージASSERT_EQ(5, Foo(i)) << " where i = " << i;
  • Google Testはテストを自動的に検出し、実行するために列挙する必要はありません
  • アサーション語彙を簡単に拡張できるようにする
  • 死亡検査(詳細ガイドを参照)
  • SCOPED_TRACE サブルーチンループ用
  • 実行するテストを決定できます
  • XMLテストレポートの生成
  • 備品 / モック / テンプレート ...

3
特にgooglemockフレームワークにあるモック機能を使って、他のフレームワークのいくつかでgoogle testを使用することを本当に楽しんでいます。
Mike

8
私はこれらすべての機能を提供します(ただし、いくつかはまだ公開されていません)。新しいテストフレームワークであるCATCHでさらに多くの機能を提供します。リンクについては私の回答を参照してください。
philsquared 2010

2
これをGoogle C ++モッキングフレームワークと組み合わせると、ユニットテストC ++コード用の非常に強力なxUnitテストフレームワークになります。
ratkok 2011年

5
@CashCowビルドでの実行は、テスト検出とは異なります。ビルドでの実行は、ビルドシステムによって異なります。あなたがいないテスト検出手段持ち、別のクラスのすべてのテストを一覧表示するだけでテストメソッドを作成し、それはそれです。
2014年

でも私は彼らがマクロを使いすぎていること、そして何かと衝突するかもしれないTESTのような一般的な単語を使用しているという事実を嫌っています。GTESTの方が優れており、衝突する可能性は低くなります。
CashCow 2014年

112

自分のフレームワークであるCATCHをそこにプッシュしました。まだ開発中ですが、他のほとんどのフレームワークをすでに上回っていると思います。人によって基準は異なりますが、私は多くのトレードオフなしにほとんどの土台をカバーしようとしました。試飲者のために私のリンクされたブログエントリを見てください。私の上位5つの機能は次のとおりです。

  • ヘッダーのみ
  • 関数とメソッドに基づくテストの自動登録
  • 標準のC ++式をLHSとRHSに分解します(そのため、assertマクロのファミリ全体を必要としません)。
  • 関数ベースのフィクスチャ内のネストされたセクションのサポート
  • 自然言語を使用した名前テスト-関数/メソッド名が生成されます

また、Objective-Cバインディングもあります。プロジェクトはGithubでホストされています


マクロの追加CHECK_FLASEをご検討くださいREQUIRE_FLASE
Emile Cormier 2014年

6
私の意見では最高のフレームワーク。
CoffeDeveloper 2015

3
doctestのは、チェックアウト-コンパイル速度に大きな焦点とキャッチの私の再実装したものですよくある質問、彼らがどのように異なるかを確認するために
onqtam

@einpoklum Catchは破棄されません-作成者はライブラリのバージョン2に取り組んでいます。doctestは、Catch 1の再実装のようなもので、いくつかのボーナスの設計決定があります
onqtam

2
すべてのテストフレームワーク(そのうちの1つを選択する必要があります)を比較すると、本当に困惑しています。doctestとCatchおよびその他の製品とを比較対照する独自の答えを書いてみませんか
einpoklum 2016年

53

特にすでにBoostを使用している場合は、 Boost Test Libraryが非常に良い選択です。

// TODO: Include your class to test here.
#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(MyTestCase)
{
    // To simplify this example test, let's suppose we'll test 'float'.
    // Some test are stupid, but all should pass.
    float x = 9.5f;

    BOOST_CHECK(x != 0.0f);
    BOOST_CHECK_EQUAL((int)x, 9);
    BOOST_CHECK_CLOSE(x, 9.5f, 0.0001f); // Checks differ no more then 0.0001%
}

それはサポートします:

  • 自動または手動のテスト登録
  • 多くの主張
  • コレクションの自動比較
  • さまざまな出力形式(XMLを含む)
  • 備品 / テンプレート ...

PS:私はそれを始めるのに役立つかもしれないそれについての記事を書きました:C ++ユニットテストフレームワーク:ブーストテストチュートリアル


私は以前Boostテストを使用していましたが、リリースごとに大幅に変化しているように見えることを除いて、それを気に入っていました。テスト用のコードを修正するよりも、APIが変更されたときにテストを修正するのに多くの時間(および彼らのお金)を費やす必要がなく、クライアントに単体テストを販売するのは十分に困難でした。結局私はそれを捨てて自分で書いた-これは約5年前だった。
コンポーネント10 10

5
チュートリアルリンクが壊れている
mloskot

2
@mloskot再び動作します。
Chris Jester-Young

@mloskot申し訳ありません。破損している場合は、直接メールでお知らせください。コメントよりも簡単に見つけることができます。:)
平日2015年

@Wernight Yup、再び動作します。Thx
mloskot


16

私は最近、特にGoogle TestとBoost Test Libraryの代替としてxUnit ++をリリースしました(比較を表示)。xUnit.Netに精通している場合は、xUnit ++の準備ができています。

#include "xUnit++/xUnit++.h"

FACT("Foo and Blah should always return the same value")
{
    Check.Equal("0", Foo()) << "Calling Foo() with no parameters should always return \"0\".";
    Assert.Equal(Foo(), Blah());
}

THEORY("Foo should return the same value it was given, converted to string", (int input, std::string expected),
    std::make_tuple(0, "0"),
    std::make_tuple(1, "1"),
    std::make_tuple(2, "2"))
{
    Assert.Equal(expected, Foo(input));
}

主な特徴:

  • 信じられないほど高速:テストは同時に実行されます
  • ポータブル
  • 自動テスト登録
  • 多くのアサーションタイプ(BoostはxUnit ++には何もありません)
  • コレクションをネイティブに比較します。
  • アサーションには3つのレベルがあります。
    • 致命的なエラー
    • 致命的でないエラー
    • 警告
  • 簡単なアサートロギング:Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • テストログ:Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
  • 備品
  • データ駆動テスト(理論)
  • 実行するテストを選択します
    • 属性マッチング
    • 名前部分文字列の一致
    • テストスイート

2
問題は比較を求めることです。IMO、フレームワークと少なくとも2つの人気のフレームワーク、googletestとBoost の違いを提示することが重要です。特に、これら2つの代替としてxUnit ++を宣伝する場合。更新された場合は+1になります:)
mloskot 2013

けっこうだ。:)私はすでに持っている比較表上のWikiを、私は直接私の答えに違いの数を合計しようとします。
moswald 2013

1
私はwikiテーブルを直接リンクすることを決めました、それはすべてをリストするために要約を乱雑にしていました。
moswald 2013

リンクは私のために機能します、ありがとう!+1
mloskot 2013

1
プロジェクトは中止されましたか?最後のコミットは2015年9月にさかのぼります...とにかく素晴らしい回答です。ありがとう。
zertyz


4

CPUnit(http://cpunit.sourceforge.net)は、Google Testに似たフレームワークですが、より少ないmacos(アサートは関数です)に依存しており、通常のマクロの落とし穴を避けるためにマクロにプレフィックスが付けられています。テストは次のようになります。

#include <cpunit>

namespace MyAssetTest {
    using namespace cpunit;

    CPUNIT_FUNC(MyAssetTest, test_stuff) {
        int some_value = 42;
        assert_equals("Wrong value!", 666, some_value);
    }

    // Fixtures go as follows:
    CPUNIT_SET_UP(MyAssetTest) {
        // Setting up suite here...
        // And the same goes for tear-down.
    }

}

これらは自動登録されるため、これ以上は必要ありません。次に、コンパイルして実行します。このフレームワークの使用は、Javaのプログラミングに時間を費やさなければならなかった人にとって、JUnitの使用と非常によく似ています。非常に素晴らしい!



2

API Sanity Checker — C / C ++ライブラリのテストフレームワーク:

共有C / C ++ライブラリの基本的な単体テストの自動生成プログラム。ヘッダーの宣言を分析することで、パラメーターの妥当な(ほとんどの場合、残念ながらすべてではない)入力データを生成し、APIのすべての関数の単純な(「健全性」または「浅い」品質)テストケースを構成できます。ファイル。

生成されたテストの品質により、簡単な使用例で重大なエラーがないことを確認できます。このツールは、生成されたテストをビルドして実行し、クラッシュ(segfaults)、アボート、発生したすべての種類の信号、ゼロ以外のプログラムの戻りコード、プログラムのハングを検出できます。

CppUnit、Boost、Google Testと比較したユニークな機能:

  • テストデータと入力引数の自動生成(複雑なデータ型の場合でも)
  • フィクスチャやテンプレートの代わりに、現代的で再利用可能な特殊タイプ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.