137

私は、数年前から開発されている大規模なc++システムに取り組んでいます。既存のコードの品質を向上させる取り組みの一環として、大規模な長期リファクタリングプロジェクトに取り組みました。

C ++で単体テストを作成するのに役立つ優れたツールを知っていますか?たぶん、JunitやNunitに似たものですか?

ユニットテストを念頭に置いて作成されたモジュールのユニットテストを作成する方法について、誰かが良いアドバイスをすることはできますか?

4

22 に答える 22

85

単体テストをレガシー コードに適用することが、『レガシー コードを効果的に扱う』が書かれたまさにその理由でした。 Michael Feathers は著者です。他の回答で述べたように、彼はCppUnitCppUnitLiteの両方の作成に関与していました。

代替テキスト

于 2008-09-18T10:47:17.373 に答える
40

Google は最近、Google Test と呼ばれる C++ アプリの単体テスト用の独自のライブラリをリリースしました。

Google Code でのプロジェクト

于 2008-09-18T10:20:58.250 に答える
30

利用可能ないくつかのスイートの優れた比較をご覧ください。その記事の著者は、後にUnitTest++を開発しました。

私が特に気に入っているのは (例外などを適切に処理するという事実は別として)、テスト ケースとテスト フィクスチャの定義に関する「管理」の量が非常に限られていることです。

于 2008-09-27T09:23:36.873 に答える
24

Boost には、単体テストのサポートを含むTesting ライブラリがあります。チェックしてみる価値があるかもしれません。

于 2008-09-18T10:25:00.470 に答える
22

Games From Withinの Noel Llopis は、 Exploring the C++ Unit Testing Framework Jungleの著者であり、さまざまな C++ 単体テスト フレームワークの包括的な (ただし現在は古い) 評価と、ゲーム プログラミングに関する書籍です。

彼はかなり長い間 CppUnitLite を使用し、さまざまなことを修正しましたが、最終的に別の単体テスト ライブラリの作成者と協力してUnitTest++を作成しました。ここでは UnitTest++ を使用していますが、今のところとても気に入っています。それは(私にとって)小さなフットプリントでパワーの正確なバランスを持っています.

私は自家製のソリューション、CxxTest (Perl が必要)、および boost::test を使用しました。私が現在の仕事で単体テストを実装したとき、それはほとんど UnitTest++ と boost::test に行き着きました。

私が使用したほとんどのブースト ライブラリは本当に気に入っていますが、私見ですが、boost::test は少し強引すぎます。特に気に入らなかったのは、boost::test マクロを使用してテスト ハーネスのメイン プログラムを実装する必要があることです。「純粋な」TDD ではないことはわかっていますが、GUI アプリケーションからテストを実行する方法が必要な場合があります。たとえば、コマンド ラインで特別なテスト フラグが渡され、boost::test がこのタイプをサポートできない場合などです。シナリオの。

UnitTest++ は、私の (限られた) 経験の中で最も簡単にセットアップして使用できるテスト フレームワークでした。

于 2008-09-18T13:35:40.590 に答える
17

私は優れたBoost.Testライブラリを、あまり知られていないが非常に素晴らしいTurtleライブラリ(Boostに基づくモックオブジェクトライブラリ)と組み合わせて使用​​しています。

calculatorコード例は言葉よりもうまく話すので、インターフェースで動作するオブジェクトをテストしたいとしviewます(これはTurtleの紹介例です)。

// declares a 'mock_view' class implementing 'view'
MOCK_BASE_CLASS( mock_view, view )
{
    // implements the 'display' method from 'view' (taking 1 argument)
    MOCK_METHOD( display, 1 )                   
};

BOOST_AUTO_TEST_CASE( zero_plus_zero_is_zero )
{
    mock_view v;
    calculator c( v );

    // expects the 'display' method to be called once with a parameter value equal to 0
    MOCK_EXPECT( v, display ).once().with( 0 ); 

    c.add( 0, 0 );
}

モックオブジェクトで期待を宣言するのがどれほど簡単で冗長かを見てください。明らかに、期待が満たされない場合、テストは失敗します。

于 2010-11-18T07:37:13.410 に答える
14

独自のフレームワークCATCHを公開しました。まだ開発中ですが、すでに他のほとんどのフレームワークを凌駕していると思います。人によって基準は異なりますが、私はトレードオフをあまり考慮せずにほとんどの分野をカバーしようとしました。リンク先のブログ エントリを参照して、味見をしてください。私の上位 5 つの機能は次のとおりです。

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

また、Objective-C バインディングも備えています。

于 2010-12-28T03:11:16.563 に答える
9

CxxTestは、軽量で使いやすく、クロス プラットフォームの JUnit/CppUnit/xUnit に似た C++ 用のフレームワークです。

于 2008-09-18T10:24:19.880 に答える
7

CppUnitがその方法です。以下のリンクを参照してください。

http://cppunit.sourceforge.net/cppunit-wiki

http://en.wikipedia.org/wiki/CppUnit

于 2008-09-18T10:10:19.507 に答える
7

UnitTest++、小さくてシンプル。

于 2008-09-18T10:20:38.670 に答える
6

私は現在、当社で長寿命のコードベースに使用できる単体テストとモック フレームワークを探しています。ご存じのように、C++のユニット テスト フレームワークのリストは長いので、いくつかのフィルターを適用して、より詳しく調べることができる一握りのフレームワークに減らしました。最初のフィルター基準は、無料であることでした。2 番目の基準は、プロジェクト活動でした。また、単体テストを作成する場合にフレームワークが必要になるため、モック フレームワークも探しました。

私は次のリストを (おおよそ) アクティビティでソートし、最も高いアクティビティが一番上になるようにしました。

  • GoogleTest / GoogleMock:多くの貢献者がおり、Google 自身によって使用されています。これはおそらくしばらくここにあり、更新を受け取ります。私のプライベート コード ベースでは、最速の列車に飛び乗れることを期待して、この組み合わせに切り替えます。

  • BoostTest + Turtle:それほど頻繁には更新されませんが、テスト フレームワークはブーストの一部であるため、維持する必要があります。一方、カメは主に 1 人の男によって維持されていますが、活発に活動しているため、死んでいません。以前の仕事で既にブースト ライブラリを使用しており、現在はプライベート コードに使用しているため、ほとんどすべてのテスト経験をこの組み合わせで行いました。

  • CppUTest:テストとモックを提供します。このプロジェクトは 2008 年から 2015 年まで活動しており、最近はかなり多くの活動が行われています。Web で検索すると、アクティビティが大幅に少ない多くのプロジェクトがより頻繁に表示されるため、この発見は少し驚きでした (2013 年に最後の更新が行われた CppUnit など)。これについては詳しく調べていないので、詳細については何も言えません。 編集 (16.12.2015):最近これを試してみたところ、特にモック クラスを使用する場合に、このフレームワークが少し不器用で「C スタイル」であることがわかりました。また、他のフレームワークよりもアサーションの種類が少ないように見えました。その主な強みは、純粋な C プロジェクトで使用できることだと思います。

  • QTest: Qt フレームワークに同梱されているテスト ライブラリ。メンテナンスはしばらくの間保証されるはずですが、テスト登録は他のフレームワークよりもIMOが不器用であるため、サポートライブラリとして使用しています。私が理解している限りでは、テスト フィクスチャごとに 1 つのテスト exe を作成する必要があります。しかし、テスト ヘルパー関数は、Qt-Gui コードをテストするときに役立ちます。モックはありません。

  • キャッチ:最近の活動がありますが、主に 1 人の男によって開発されています。このフレームワークの良いところは、テスト自体で再利用可能なフィクスチャ コードを記述できる代替フィクスチャ アプローチです。また、テスト名を文字列として設定することもできます。これは、文全体をテスト名として書きがちな場合に便利です。このスタイルが取り除かれ、googleTest に入れられることを望みます ;-)

モック フレームワーク

モック フレームワークの数は、テスト フレームワークの数よりもはるかに少ないですが、最近のアクティビティで見つかったものを以下に示します。

  • Hippomock : 2008 年から活発に活動していますが、強度は低いです。

  • FakeIt : 2013 年から活動を始めましたが、ほぼ 1 人の人物によって開発されました。

結論

コードベースが長期的に使用される場合は、BoostTest + TurtleまたはGoogleTest + GoogleMock のいずれかを選択してください。この2つは長期メンテナンスになると思います。短命のコードベースしかない場合は、優れた構文を持つCatchを試すことができます。次に、モッキング フレームワークを追加で選択する必要があります。Visual Studio を使用している場合は、BoostTest および GoogleTest 用のテスト ランナー アダプターをダウンロードできます。これにより、VS に統合されたテスト ランナー GUI でテストを実行できます。

于 2015-11-25T20:09:40.250 に答える
3

密接に関連する質問「c++ 単体テスト ツール/フレームワークの選択」への回答も参照してください

于 2008-09-22T07:51:37.113 に答える
3

テンプレートベースのフレームワークであるTUT、 Template-Unit-Testもあります。構文は扱いにくいですが (テンプレートの悪用と呼ばれることもあります)、主な利点は、すべてが 1つのヘッダー ファイルに含まれていることです。

ここで、TUT で書かれた単体テストの例を見つけることができます。

于 2008-10-13T19:34:24.617 に答える
2

CPPunit を試してみましたが、あまりユーザーフレンドリーではありません。

私が知っている唯一の代替手段は、C++ .NET を使用して C++ クラスをラップし、.NET 単体テスト フレームワーク (NUnit、MBUnit など) のいずれかで単体テストを作成することです。

于 2008-09-18T10:18:30.907 に答える
2

CppUTestは、C および C++ 単体テスト用の優れた軽量フレームワークです。

于 2011-06-07T18:33:35.200 に答える
1

CUnitWin32をご覧ください。これはMSVisualC用に書かれています。例が含まれています。

于 2009-02-12T22:16:59.763 に答える
1

VisualAssertは VS 統合で素晴らしい仕事をしていると思います。VS からテストを実行およびデバッグでき、テストを実行するために実行可能ファイルを作成する必要はありません。

于 2010-09-27T08:36:40.323 に答える
1

ObjectMentor の Michael Feathers は、CppUnit と CppUnitLite の両方の開発に尽力しました。

彼は現在、CppUnitLiteを推奨しています

于 2008-09-18T10:13:36.630 に答える
1

Visual Studio 2008 SP1 を使用している場合は、単体テストの作成に MSTest を使用することを強くお勧めします。次に、モックの作成に Google モックを使用します。IDE との統合は理想的であり、1 つのテストを追加するために 3 つの場所を編集するという点で、CPPunit のオーバーヘッドを許容し、負担しません。

于 2009-05-11T19:30:45.120 に答える
1

cfix ( http://www.cfix-testing.org ) を参照してください。これは Windows C/C++ 開発に特化しており、ユーザー モードとカーネル モードの両方の単体テストをサポートしています。

于 2009-02-23T07:17:02.117 に答える
0

フルクトースをチェックしてください:http ://sourceforge.net/projects/fructose/

これは非常にシンプルなフレームワークであり、ヘッダーファイルのみが含まれているため、簡単に移植できます。

于 2008-09-22T07:31:35.180 に答える
0

Typemock Isolator++で MS Test を使用しています。試してみる!

于 2016-03-17T10:50:02.527 に答える