web-dev-qa-db-ja.com

C ++コードの単体テスト-ツールと方法論

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

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

単体テストを考慮せずに作成されたモジュールの単体テストを作成する方法について、誰かが良いアドバイスを与えることができますか?

134
Sakin

レガシーコードにユニットテストを適用することは、非常に理由がありますレガシーコードを効果的に使用する が記述されていました。 Michael Feathersは著者です。他の回答で述べたように、彼は CppUnitCppUnitLite の両方の作成に関与していました。

alt text

81
Joe Schneider

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

Google Codeのプロジェクト

39
agnul

いくつかの利用可能なスイート間で優れた 比較 をチェックしてください。その記事の著者は後に開発しました nitTest ++

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

30
andreas buykx

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

24
Jonas

Games From WithinのNoel Llopisは Exploring the C++ Unit Testing Framework Jungle の著者であり、包括的な(ただし現在は日付が付けられています)さまざまなC++ユニットテストフレームワークの評価、およびゲームプログラミングに関する本。

彼はCppUnitLiteをしばらく使用してさまざまな問題を修正しましたが、最終的に別のユニットテストライブラリの作成者と力を合わせて、 nitTest ++ を作成しました。ここではUnitTest ++を使用していますが、これまでのところとても気に入っています。それは(私にとって)小さなフットプリントで正確なパワーのバランスを持っています。

自家製のソリューション、CxxTest(Perlが必要)、およびboost :: testを使用しました。ここで現在の仕事で単体テストを実装したとき、UnitTest ++ vs boost :: testにほぼなりました。

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

UnitTest ++は、(限られた)経験で私が遭遇したセットアップと使用のための最も単純なテストフレームワークでした。

21
Brian Stewart

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

コード例の方が言葉よりも優れているので、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 );
}

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

17
icecrime

独自のフレームワーク [〜#〜] catch [〜#〜] をプッシュしたところです。まだ開発中ですが、他のほとんどのフレームワークをすでに上回っていると思います。人によって条件は異なりますが、トレードオフをあまりせずにほとんどの領域をカバーしようとしました。リンクされたテイスターのブログエントリをご覧ください。私の上位5つの機能は次のとおりです。

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

また、Objective-Cバインディングもあります。

14
philsquared

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

9
David Sykes

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

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

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

7
Jorge Ferreira

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

7
yrp

現在、私たちの会社で長寿命のコードベースに使用できる単体テストと模擬フレームワークを探しています。ご存知のように、c ++の ユニットテストフレームワークのリスト は長いため、いくつかのフィルターを適用して、より詳細に調べることができる手作業に減らしました。最初のフィルター基準は、無料でなければならないということでした。 2番目の基準はプロジェクトアクティビティでした。ユニットテストを作成する場合はモックフレームワークが必要なので、モックフレームワークも探しました。

アクティビティ別にソートされた(おおよそ)次のリストを思いつきました。

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

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

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

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

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

モックフレームワーク

モックフレームワークの数はテストフレームワークの数よりもはるかに少ないですが、ここに最近のアクティビティがあることがわかりました。

  • Hippomock:2008 unitlからアクティブになりましたが、強度は低いです。

  • FakeIt:2013 unitlからアクティブになりましたが、多かれ少なかれ1人の男によって開発されました。

結論

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

5
Knitschi

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

3
TonJ

[〜#〜] tut [〜#〜] 、テンプレートベースのフレームワークであるTemplate-Unit-Testもあります。構文は厄介ですが(テンプレート乱用と呼ばれることもあります)、その主な利点は、すべてが 単一のヘッダーファイル に含まれていることです。

TUTで記述された単体テストの例 があります。

3
philant

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

2
ratkok

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

私が知っている唯一の選択肢は、C++。NETを使用してC++クラスをラップし、.NETユニットテストフレームワーク(NUnit、MBUnitなど)の1つでユニットテストを記述することです。

2
Dror Helper

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

1
Jared

Cfix( http://www.cfix-testing.org )をご覧ください。WindowsC/C++開発に特化しており、ユーザーモードとカーネルモードの両方のユニットテストをサポートしています。

1

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

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

1
Seb Rose

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

1
Ohad Horesh

CUnitWin32 をご覧ください。 MS Visual C用に作成されています。例が含まれています。

1
Dushara

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

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

0
rik

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

0
Sam