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


134

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

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

誰かがユニットテストを考慮せずに書かれたモジュールのユニットテストを書く方法論について何か良いアドバイスを与えることはできますか?


1
この質問を確認してください:stackoverflow.com/questions/3150/…–
アードバーク

回答:


83

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

代替テキスト


4
サムネイルを追加-投票。本はどんなツールよりも役立ちます。
岐阜

2
CPPUnitを使用すると、テストを簡単に作成できると思います。CPPUnitを使用していますが、満足できません。テストごとに2つのファイルを更新する必要があります。私の意見では、テストは次のように簡単に記述できます。 'TEST( "testname"){ASSERT(1 == 1);}'一方、本はレガシーコードを
扱う

9
C ++レガシーはいつからですか?
Nils

9
それはC ++がレガシーであるということではありません。私が正しく思い出すと、その本はレガシープロジェクトを単体テストがないか、非常に少ないものとして定義しています。テスト駆動開発はコードベースに影響を与えてそれらを書くのは簡単なことではないので、そのようなプロジェクトは単体テストを書くのが/ hard /になる傾向があります。
Arafangion

7
@Nils:この本のAmazonレビューアの1人が述べているように、「レガシーコードはユニットテストのないコード」であり、これがまさにこの質問に関するものです。
David Johnstone、

40

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

Google Codeのプロジェクト


1
これをVC ++で使用することは可能ですか
yesraaj '31年

特に各アサーションに説明を追加する必要がある方法は、大丈夫だと思います。不利な点として、私は個人的には、実際にはクラスのように見えないマクロの代わりに、単体テストクラスを使用することを好みます。
2010

3
もう1つの良い点は、モックの可能性です。code.google.com
Philipp

これは、テストを機能させるために大量のマクロとマジックファイルを必要とするCPPUNITよりもはるかに優れています
2013年

30

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

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


2
それは私たちの根本的な誤りではありませんか?彼は利用可能なプロジェクトをよく理解していますが、プロジェクトを改善するのではなく、自分のプロジェクトを開始します。
peterchen 2010年

@peterchen:はい; しかし、UnitTest ++は非常に小さく軽量であるため、独立したプロジェクトであることに価値があります。簡単に立ち上げて実行することができます。
TimStaley

24

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


4
この優れたツールキットをお勧めします。
Rob、

1
はい、ブーストは行く方法です。オーバーヘッドはありません。テストして実行してください!ブーストが助けになったとき、私は絶望的に自分のフレームワークに取り組んでいました。ブーストありがとう(すべてのもの!)
daramarak

あなたは、私が紹介ブーストユニットテストを書いた記事をチェックアウトかもしれberoux.com/english/articles/boost_unit_testingを
Wernight

21

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 ++は、(限られた)経験で遭遇したセットアップと使用のための最も単純なテストフレームワークでした。


17

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

コード例は言葉よりも優れているのでcalculatorviewインターフェースで機能するオブジェクトをテストしたいとしましょう(つまり、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 );
}

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


14

私は自分のフレームワークであるCATCHをそこにプッシュしました。まだ開発中ですが、他のほとんどのフレームワークをすでに上回っていると思います。人によって基準は異なりますが、私は多くのトレードオフなしにほとんどの土台をカバーしようとしました。試飲者のために私のリンクされたブログエントリを見てください。私の上位5つの機能は次のとおりです。

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

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


4
doctestは、Catchの再実装であり、コンパイル速度に重点を置いています-FAQをチェックして、それらの違いを確認してください
onqtam




6

私は現在、長寿命のコードベースのために私たちの会社で使用できるユニットテストとモックフレームワークを探しています。あなたが知っているように、ユニットテストフレームワークのリストように、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でテストを実行できます。


3

、密接に関連する質問「C ++ユニットテストツール/フレームワークの選択」にも答えを参照してくださいここに


3

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

あなたは見つけることができますTUTと書かれたユニットテストの例ここに。


2
TUTの機能を保証するマクロを提供するヘッダーのみのライブラリと、デクリレーションコードをテストして、それを簡素化し、失敗したファイルと行番号の情報を提供します。出力とコードの違いの例を含む投稿へのリンクと、github上のプロジェクトへのリンクは次のとおり
Josh

2

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

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





1

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


共有いただきありがとうございます。私は最近、テスト目的でcfixの使用を開始しました。テストケースが成功した場合と失敗した場合の両方でコールスタックを表示する方法を探していました。これを達成する方法はcfixにありますか?
tryToLearn

1

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


1

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



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.