C ++単体テストフレームワークの比較[終了]
-
04-07-2019 - |
質問
C ++単体テストフレームワークの推奨事項に関する質問が既にいくつかあることは知っていますが、フレームワークの1つを推奨しているだけで(機能)比較に関する情報は提供していないため、すべての回答は役に立たなかった。
最も興味深いフレームワークは、CppUnit、Boost、および新しいGoogleテストフレームワークです。誰もまだ比較をしましたか?
解決
この質問を見る議論のために。
彼らは記事を推薦します: C ++単体テストフレームワークジャングルの探索、Noel Llopis著。 さらに最近の: C ++ Test Unit Frameworks
googletestを他のフレームワークと比較する記事はまだ見つかりません。
他のヒント
新しいプレーヤーは Google Test ( Google C ++ Testing Frameworkとも呼ばれます) )これはかなりいいです。
#include <gtest/gtest.h>
TEST(MyTestSuitName, MyTestCaseName) {
int actual = 1;
EXPECT_GT(actual, 0);
EXPECT_EQ(1, actual) << "Should be equal to one";
}
主な機能:
- ポータブル
- 致命的および非致命的アサーション
- 簡単なアサーション情報メッセージ:
ASSERT_EQ(5, Foo(i)) << " where i = " << i;
- Google Testは自動的にテストを検出し、テストを実行するために列挙する必要はありません
- アサーションの語彙を拡張しやすくします
- 死亡テスト(詳細ガイドを参照)
-
SCOPED_TRACE
サブルーチンループの場合 - 実行するテスト を決定できます
- XML テストレポートの生成
- フィクスチャ / モック / テンプレート ...
自分のフレームワークキャッチ。まだ開発中ですが、他のほとんどのフレームワークをすでに上回っていると思います。 人によって基準は異なりますが、トレードオフをあまりせずにほとんどの領域をカバーしようとしました。 リンクされたテイスターのブログエントリをご覧ください。私の上位5つの機能は次のとおりです。
- ヘッダーのみ
- 関数およびメソッドベースのテストの自動登録
- 標準のC ++式をLHSとRHSに分解します(したがって、アサートマクロのファミリ全体は必要ありません)。
- 関数ベースのフィクスチャ内のネストされたセクションのサポート
- 自然言語を使用した名前のテスト-関数/メソッドの名前が生成されます
Objective-Cバインディングもあります。プロジェクトは Github
でホストされていますブーストテストライブラリ は、特にBoostを既に使用している場合には非常に良い選択です。
// TODO: Include your class to test here.
#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_CASE(MyTestCase)
{
// To simplify this example test, let's suppose we'll test 'float'.
// Some test are stupid, but all should pass.
float x = 9.5f;
BOOST_CHECK(x != 0.0f);
BOOST_CHECK_EQUAL((int)x, 9);
BOOST_CHECK_CLOSE(x, 9.5f, 0.0001f); // Checks differ no more then 0.0001%
}
以下をサポートしています:
- 自動または手動テストの登録
- 多くのアサーション
- コレクションの自動比較
- さまざまな出力形式( XML を含む)
- フィクスチャ / テンプレート ...
PS:開始に役立つ可能性のある記事を書きました: C ++単体テストフレームワーク:ブーストテストチュートリアル
ウィキペディアには包括的な単体テストフレームワークのリストがあり、サポートされている機能を特定する表があります。
最近 xUnit ++ をリリースしました。具体的にはGoogle TestとBoost Test Libraryの代替として(比較)。 xUnit.Netに慣れている場合は、xUnit ++の準備ができています。
#include "xUnit++/xUnit++.h"
FACT("Foo and Blah should always return the same value")
{
Check.Equal("0", Foo()) << "Calling Foo() with no parameters should always return \"0\".";
Assert.Equal(Foo(), Blah());
}
THEORY("Foo should return the same value it was given, converted to string", (int input, std::string expected),
std::make_tuple(0, "0"),
std::make_tuple(1, "1"),
std::make_tuple(2, "2"))
{
Assert.Equal(expected, Foo(input));
}
主な機能:
- 非常に高速:テストは同時に実行されます。
- ポータブル
- 自動テスト登録
- 多くのアサーションタイプ(BoostはxUnit ++では何もありません)
- ネイティブにコレクションを比較します。
- アサーションには、 3つのレベルがあります。
- 致命的なエラー
- 致命的でないエラー
- 警告
- 簡単なアサートロギング:
Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
- テストロギング:
Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
- フィクスチャー
- データ駆動型テスト(理論)
- 実行するテストの選択:
- 属性の一致
- 名前の部分文字列一致
- テストスイート
CppUTest -モックライブラリを備えた非常に優れた軽量フレームワーク。じっくり見てみましょう。
CPUnit( http://cpunit.sourceforge.net )は、Google Testに似たフレームワークです。ただし、これはより少ないmacos(アサートは関数)に依存し、通常のマクロの落とし穴を避けるためにマクロにプレフィックスが付けられます。テストは次のようになります。
#include <cpunit>
namespace MyAssetTest {
using namespace cpunit;
CPUNIT_FUNC(MyAssetTest, test_stuff) {
int some_value = 42;
assert_equals("Wrong value!", 666, some_value);
}
// Fixtures go as follows:
CPUNIT_SET_UP(MyAssetTest) {
// Setting up suite here...
// And the same goes for tear-down.
}
}
これらは自動登録されるため、これ以上必要ありません。次に、コンパイルして実行します。 Javaのプログラミングに時間を費やさなければならない人にとって、このフレームワークの使用はJUnitの使用に非常によく似ています。とても素晴らしい!
関連するC ++ユニットテストリソースがいくつかあります。 http://www.progweap.com/resources.html
API健全性チェッカー <!>#8212; C / C ++ライブラリのテストフレームワーク:
共有C / C ++ライブラリの基本ユニットテストの自動ジェネレータ。パラメーターの合理的な(ほとんどの場合、残念ながらすべてではない)入力データを生成し、単純な(<!> quot; sanity <!> quot;または<!> quot; shallow <!> quot; -qualityを構成することができます)ヘッダーファイルの宣言の分析によるAPIのすべての関数のテストケース。
生成されたテストの品質により、単純なユースケースで重大なエラーがないことを確認できます。このツールは、生成されたテストを構築および実行し、クラッシュ(セグメンテーション違反)、中止、すべての種類の発信信号、ゼロ以外のプログラム戻りコード、およびプログラムのハングを検出できます。
CppUnit、Boost、Google Testと比較した独自の機能:
- テストデータと入力引数の自動生成(複雑なデータ型であっても)
- フィクスチャーやフィクスチャの代わりに、最新かつ高度に再利用可能な特殊なタイプテンプレート