web-dev-qa-db-ja.com

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

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

最も興味深いフレームワークはCppUnit、Boost、そして新しいGoogleテストフレームワークだと思います。誰かがまだ比較をしたことがありますか?

280
housemaister

この質問を参照 議論のために。

彼らは記事を推薦します: C++単体テストフレームワークのジャングルを探る 、Noel Llopis著。そしてより最近のもの: C++テストユニットフレームワーク

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

90
Sam Saffron

新しいプレーヤーは 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テストレポートの生成
  • 備品/モック/テンプレート...
113
Wernight

私は自分自身のフレームワーク、 CATCH をプッシュしました。まだ開発中ですが、他のほとんどのフレームワークをすでに上回っていると思います。さまざまな人々がさまざまな基準を持っていますが、私はあまり多くのトレードオフなしでほとんどの分野をカバーしようとしました。私のリンクされているブログのエントリーを見てテイスターを見てください。私のトップ5の機能は以下のとおりです。

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

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

103
philsquared

Boost Test Libraryは、特にBoostを既に使っている人にとっては非常に良い選択です。

// 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を含む)
  • 備品/テンプレート...

シモンズ:私はあなたが始めるのを助けるかもしれないそれについての記事を書きました: C++単体テストフレームワーク:ブーストテストチュートリアル

50
Wernight

ウィキペディアには包括的な 単体テストフレームワークのリスト があり、サポートされているかどうかを特定する表があります。

21
John Deters

私は最近 xUnit ++ をリリースしました。具体的にはGoogle TestとBoost Test Libraryの代替としてです( 比較 をご覧ください)。 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";
  • 備品
  • データ駆動型テスト(理論)
  • どのテストを実行するかを選択します
    • 属性マッチング
    • 名前のサブストリングmatchin
    • テストスイート
14
moswald

CppUTest - モックライブラリを使ったとても素敵で軽量なフレームワーク。もう少し詳しく見てみる価値があります。

4
ratkok

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.
    }

}

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

4
Roger

いくつかの関連するC++単体テストのリソースがあります http://www.progweap.com/resources.html

3
Dave Young

API健全性チェッカー - C/C++ライブラリ用のテストフレームワーク:

共有C/C++ライブラリ用の基本単体テストの自動ジェネレータ。パラメータの妥当な(ほとんどの、残念ながら全部ではないが)入力データを生成し、ヘッダ内の宣言を分析することによって、API内のすべての関数に対して単純な(「健全性」または「浅い」品質)テストケースを作成できます。ファイル.

生成されたテストの品質により、簡単な使用例で重大なエラーがないことを確認できます。このツールは、生成されたテストを構築して実行し、クラッシュ(セグメンテーション違反)、中止、あらゆる種類の発行されたシグナル、ゼロ以外のプログラム戻りコード、およびプログラムのハングを検出することができます。

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

  • テストデータと入力引数の自動生成(複雑なデータ型の場合でも)
  • モダンで再利用性が高い 特殊な型 器具やテンプレートの代わりに==
2
linuxbuild