私は、数年前から開発されている大規模なc++システムに取り組んでいます。既存のコードの品質を向上させる取り組みの一環として、大規模な長期リファクタリングプロジェクトに取り組みました。
C ++で単体テストを作成するのに役立つ優れたツールを知っていますか?たぶん、JunitやNunitに似たものですか?
ユニットテストを念頭に置いて作成されたモジュールのユニットテストを作成する方法について、誰かが良いアドバイスをすることはできますか?
私は、数年前から開発されている大規模なc++システムに取り組んでいます。既存のコードの品質を向上させる取り組みの一環として、大規模な長期リファクタリングプロジェクトに取り組みました。
C ++で単体テストを作成するのに役立つ優れたツールを知っていますか?たぶん、JunitやNunitに似たものですか?
ユニットテストを念頭に置いて作成されたモジュールのユニットテストを作成する方法について、誰かが良いアドバイスをすることはできますか?
単体テストをレガシー コードに適用することが、『レガシー コードを効果的に扱う』が書かれたまさにその理由でした。 Michael Feathers は著者です。他の回答で述べたように、彼はCppUnitとCppUnitLiteの両方の作成に関与していました。
Google は最近、Google Test と呼ばれる C++ アプリの単体テスト用の独自のライブラリをリリースしました。
利用可能ないくつかのスイートの優れた比較をご覧ください。その記事の著者は、後にUnitTest++を開発しました。
私が特に気に入っているのは (例外などを適切に処理するという事実は別として)、テスト ケースとテスト フィクスチャの定義に関する「管理」の量が非常に限られていることです。
Boost には、単体テストのサポートを含むTesting ライブラリがあります。チェックしてみる価値があるかもしれません。
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++ は、私の (限られた) 経験の中で最も簡単にセットアップして使用できるテスト フレームワークでした。
私は優れた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 );
}
モックオブジェクトで期待を宣言するのがどれほど簡単で冗長かを見てください。明らかに、期待が満たされない場合、テストは失敗します。
独自のフレームワークCATCHを公開しました。まだ開発中ですが、すでに他のほとんどのフレームワークを凌駕していると思います。人によって基準は異なりますが、私はトレードオフをあまり考慮せずにほとんどの分野をカバーしようとしました。リンク先のブログ エントリを参照して、味見をしてください。私の上位 5 つの機能は次のとおりです。
また、Objective-C バインディングも備えています。
CxxTestは、軽量で使いやすく、クロス プラットフォームの JUnit/CppUnit/xUnit に似た C++ 用のフレームワークです。
CppUnitがその方法です。以下のリンクを参照してください。
UnitTest++、小さくてシンプル。
私は現在、当社で長寿命のコードベースに使用できる単体テストとモック フレームワークを探しています。ご存じのように、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 でテストを実行できます。
密接に関連する質問「c++ 単体テスト ツール/フレームワークの選択」への回答も参照してください。
テンプレートベースのフレームワークであるTUT、 Template-Unit-Testもあります。構文は扱いにくいですが (テンプレートの悪用と呼ばれることもあります)、主な利点は、すべてが 1つのヘッダー ファイルに含まれていることです。
ここで、TUT で書かれた単体テストの例を見つけることができます。
CPPunit を試してみましたが、あまりユーザーフレンドリーではありません。
私が知っている唯一の代替手段は、C++ .NET を使用して C++ クラスをラップし、.NET 単体テスト フレームワーク (NUnit、MBUnit など) のいずれかで単体テストを作成することです。
CppUTestは、C および C++ 単体テスト用の優れた軽量フレームワークです。
CUnitWin32をご覧ください。これはMSVisualC用に書かれています。例が含まれています。
VisualAssertは VS 統合で素晴らしい仕事をしていると思います。VS からテストを実行およびデバッグでき、テストを実行するために実行可能ファイルを作成する必要はありません。
ObjectMentor の Michael Feathers は、CppUnit と CppUnitLite の両方の開発に尽力しました。
彼は現在、CppUnitLiteを推奨しています
Visual Studio 2008 SP1 を使用している場合は、単体テストの作成に MSTest を使用することを強くお勧めします。次に、モックの作成に Google モックを使用します。IDE との統合は理想的であり、1 つのテストを追加するために 3 つの場所を編集するという点で、CPPunit のオーバーヘッドを許容し、負担しません。
cfix ( http://www.cfix-testing.org ) を参照してください。これは Windows C/C++ 開発に特化しており、ユーザー モードとカーネル モードの両方の単体テストをサポートしています。
フルクトースをチェックしてください:http ://sourceforge.net/projects/fructose/
これは非常にシンプルなフレームワークであり、ヘッダーファイルのみが含まれているため、簡単に移植できます。
Typemock Isolator++で MS Test を使用しています。試してみる!