回答:
レガシーコードにユニットテストを適用することは、レガシーコードで効果的に機能することが書かれたまさにその理由 でした。Michael Feathersが作者です。他の回答で述べたように、彼はCppUnitとCppUnitLiteの両方の作成に関与しました。
Googleは最近、Google Testと呼ばれるC ++アプリの単体テスト用の独自のライブラリをリリースしました。
いくつかの利用可能なスイート間の優れた比較をチェックしてください。その記事の著者は、後でUnitTest ++を開発しました。
(例外などを適切に処理するという事実は別として)私が特に気に入っているのは、テストケースとテストフィクスチャの定義に関する「管理」の量が非常に限られていることです。
ブーストには ユニットテストのサポートを含むテストライブラリがあります。チェックアウトする価値があるかもしれません。
Games From Withinの Noel Llopisは、Exploring the C ++ Unit Testing Framework Jungleの著者であり、さまざまなC ++ユニットテストフレームワークの包括的な(現在は日付が付けられています)評価、およびゲームプログラミングに関する本です。
彼はかなりの間CppUnitLiteを使用してさまざまなものを修正しましたが、最終的には別のユニットテストライブラリの作者と協力してUnitTest ++を作成しました。ここではUnitTest ++を使用していますが、今のところ私はとても気に入っています。それは(私にとって)小さなフットプリントで力の正確な正しいバランスを持っています。
私は自家製のソリューション、CxxTest(Perlが必要)、およびboost :: testを使用しました。私が現在の仕事でここでユニットテストを実装したとき、それはほとんどUnitTest ++とboost :: testに行き着きました。
私が使用したほとんどのboostライブラリは本当に好きですが、私見、boost :: testはちょっとやり過ぎです。私は特に、(AFAIK)がboost :: testマクロを使用してテストハーネスのメインプログラムを実装する必要があることを気に入らなかった。「純粋な」TDDではないことはわかっていますが、たとえば、特別なテストフラグがコマンドラインで渡され、boost :: testがこのタイプをサポートできない場合など、GUIアプリケーションを使用してテストを実行する方法が必要になる場合があります。シナリオの。
UnitTest ++は、(限られた)経験で遭遇したセットアップと使用のための最も単純なテストフレームワークでした。
私は優れたBoost.Testライブラリーを、あまり知られていないが非常に素晴らしいタートルと組み合わせて使用していますライブラリー(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 );
}
それがいかに簡単で冗長であるかを見て、モックオブジェクトへの期待を宣言しますか?明らかに、期待が満たされない場合、テストは失敗します。
私は自分のフレームワークであるCATCHをそこにプッシュしました。まだ開発中ですが、他のほとんどのフレームワークをすでに上回っていると思います。人によって基準は異なりますが、私は多くのトレードオフなしにほとんどの土台をカバーしようとしました。試飲者のために私のリンクされたブログエントリを見てください。私の上位5つの機能は次のとおりです。
また、Objective-Cバインディングもあります。
CxxTestは、C ++用の軽量で使いやすいクロスプラットフォームのJUnit / CppUnit / xUnitのようなフレームワークです。
CppUnitがその方法です。以下のリンクを参照してください。
UnitTest ++、小さくてシンプル。
私は現在、長寿命のコードベースのために私たちの会社で使用できるユニットテストとモックフレームワークを探しています。あなたが知っているように、ユニットテストフレームワークのリストように、c ++のは長いので、いくつかのフィルターを適用して、より詳しく調べることができるように、フィルターをハンドフルに減らしました。最初のフィルター基準は、無料である必要があるということでした。第二の基準はプロジェクト活動でした。単体テストを記述したい場合はモックフレームワークが必要なので、モックフレームワークも探しました。
私は次のリストを(おおよそ)アクティビティでソートし、最高のアクティビティを上部に表示しました。
GoogleTest / GoogleMock:多くの寄稿者であり、Google自身が使用しています。これはおそらくしばらくここにあり、更新を受け取ります。私のプライベートコードベースでは、最速の列車に乗るためにこの組み合わせに切り替えます。
BoostTest + Turtle:それほど頻繁には更新されませんが、テストフレームワークはboostの一部なので、維持する必要があります。一方、カメは主に一人の男によって維持されますが、それは死んでいないので憤慨しています。私は前の仕事ですでにboostライブラリを使用していて、現在はプライベートコードに使用しているため、この組み合わせでほぼすべてのテスト経験をしました。
CppUTest:テストとモックを提供します。このプロジェクトは2008年から2015年まで活動しており、最近の活動は非常に多くなっています。2013年に最後に更新されたCppUnitのように、Webで検索すると、アクティビティが大幅に少ない多くのプロジェクトが頻繁に表示されるため、この発見は少し驚きでした。私はこれについて詳しく調べていないので、詳細については何も言えません。 編集(16.12.2015):私は最近これを試してみましたが、特にモッククラスを使用する場合、このフレームワークは少し不格好で「Cスタイリッシュ」であることがわかりました。また、他のフレームワークよりもアサーションの種類が少ないようです。その主な長所は、純粋なCプロジェクトで使用できることです。
QTest: Qtフレームワークに付属するテストライブラリ。メンテナンスはしばらくの間保証されるはずですが、テスト登録は他のフレームワークよりもIMOより不格好であるため、サポートライブラリとして使用します。私が理解している限り、テストフィクスチャごとに1つのテストexeが必要になります。しかし、Qt-Guiコードをテストする場合、テストヘルパー関数が役立ちます。モックはありません。
キャッチ:最近の活動がありますが、主に1人の男によって開発されています。このフレームワークの良い点は、テスト自体で再利用可能なフィクスチャーコードを記述できる代替のフィクスチャーアプローチです。また、テスト名を文字列として設定できるため、文全体をテスト名として記述する場合に便利です。私はこのスタイルをリッピングしてgoogleTestに入れます;-)
モックフレームワークの数はテストフレームワークの数よりもはるかに少ないですが、ここに最近の活動があることがわかりました。
ヒポモック:2008年からアクティブになりましたが、現在は強度が低くなっています。
FakeIt:2013年からアクティブになりましたが、多かれ少なかれ1人の男が開発しました。
あなたのコードベースが長期のためにある場合は、間の間で選択BoostTest +タートルとGoogleTest + GoogleMock。この2つは長期的にメンテナンスされると思います。有効なコードベースが短い場合は、構文が優れているCatchを試すことができます。次に、モックフレームワークを追加で選択する必要があります。Visual Studioを使用している場合は、BoostTestおよびGoogleTest用のテストランナーアダプターをダウンロードできます。これにより、VSに統合されているテストランナーGUIでテストを実行できます。
テンプレートベースのフレームワークであるTUT、Template-Unit-Test もあります。構文は厄介です(テンプレートを悪用するものもあります)が、その主な利点は、すべてが1 つのヘッダーファイルに含まれていることです。
あなたは見つけることができますTUTと書かれたユニットテストの例ここに。
ObjectMentorのMichael Feathersは、CppUnitとCppUnitLiteの両方の開発に尽力しました。
彼は現在CppUnitLiteを推奨しています
見ていCUnitWin32を。MS Visual C用に書かれています。例が含まれています。
cfix(http://www.cfix-testing.org)をご覧ください。WindowsC / C ++開発に特化しており、ユーザーモードとカーネルモードのユニットテストの両方をサポートしています。
VisualAssertはVS統合で素晴らしい仕事をしていると思います。VSからテストを実行およびデバッグでき、テストを実行するために実行可能ファイルを作成する必要はありません。
フルクトースを確認してください:http : //sourceforge.net/projects/fructose/
これは非常にシンプルなフレームワークで、ヘッダーファイルのみが含まれているため、移植が簡単です。
Typemock Isolator ++で MS Testを使用しています。試してみる!