21

私はcppunitに出くわしましたが、それは非常に使いやすいようには見えませんでした(おそらく、C++がJava/ C#のように機能しないため、私はハードに見えませんでした)。広く使用されている単純な代替手段はありますか?

実際、cppunitはC ++の標準的な単体テストフレームワークですか

4

8 に答える 8

23

C++用の標準の単体テストライブラリはありません。選択できる選択肢はたくさんあります。cppunitはそれらの1つです。

私の会社では、単体テストとオブジェクトモックにパートナーのGoogleMockと一緒にGoogleTestを使用しています。私はそれらの両方がcppunitよりも使いやすくそしてはるかに強力であると感じています。

于 2010-01-10T21:31:45.267 に答える
23

独自のフレームワークCATCHを公開しました。まだ開発中ですが、すでに他のほとんどのフレームワークを凌駕していると思います。人によって基準は異なりますが、私はトレードオフをあまり考慮せずにほとんどの分野をカバーしようとしました。リンク先のブログ エントリを参照して、味見をしてください。私の上位 5 つの機能は次のとおりです。

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

また、Objective-C バインディングも備えています。

例として、@dmeister が引用した gtest の例に相当するものを記述する方法を次に示します。

TEST_CASE( "Factorial/Handles zero input", "Tests factorial of 0.") 
{
  REQUIRE( Factorial(0) == 1 );
}

TEST_CASE( "Factorial/Handles positive input", "Tests factorial of positive numbers.") 
{
  REQUIRE( Factorial(1) == 1 );
  REQUIRE( Factorial(2) == 2 );
  REQUIRE( Factorial(3) == 6 );
  REQUIRE( Factorial(8) == 40320 );
}

テストが失敗した場合でも、LHS と RHS の値が個別に記録されます。

于 2010-12-28T03:18:08.237 に答える
6

GoogleTestFrameworkは代替手段です。

ドキュメントからの簡単な例を次に示します。

// Tests factorial of 0.
TEST(FactorialTest, HandlesZeroInput) {
  EXPECT_EQ(1, Factorial(0));
}

// Tests factorial of positive numbers.
TEST(FactorialTest, HandlesPositiveInput) {
  EXPECT_EQ(1, Factorial(1));
  EXPECT_EQ(2, Factorial(2));
  EXPECT_EQ(6, Factorial(3));
  EXPECT_EQ(40320, Factorial(8));
}

また、GoogleのC++用モックフレームワークであるgmockともうまく連携します。

于 2010-01-10T21:34:13.673 に答える
2

自分のコード開発者のために、 saru( http://github.com/mikeando/saru )というテストスイートを作成しました。そのBSDライセンスコード。他のテストスイートの機能のいくつかが気に入らなかったので、私はそれを開発しました。広く使用されていませんが、2つの会社にまたがるいくつかの商業プロジェクトで使用しました。

  1. すべてのテストが1つのバイナリにコンパイルされるのは好きではありません。これの私の理由は、コンパイルが失敗した場合、すべてのテストが失敗し、1つのテストが未定義の動作をした場合、プログラム出力は未定義です。
  2. 実行するテストを制御したい。テストをグループ化してサブセットを実行できるようにしたい。
  3. テストのコンパイルの失敗をテストの失敗として報告し、すべてのテストの実行を停止しないようにしたい。
  4. 複数の異なる言語からテストを実行できるようにしたい
  5. valgrindで特定のテストを実行できるほど柔軟なシステムが必要です(まだsaruではありません:()

したがって、saruはこれらの機能のほとんどに対応しています。その焦点は、さまざまな言語で書かれた一連のテストを実行できるようにすることです。最小限のテストサイズで。これが最小の(失敗した)C++テストです

//SARU : dummy dummy
int main() { return (1==2)?0:1; }

saruが本当に気にするのは、コンパイルするバイナリの戻り値だけです。次に、出力を解析して、失敗したテストなどを判別します。上記の簡単な例よりもC++での作業を少し良くするためのヘッダーがあります。

//SARU : dummy dummy
#include "MyStruct.h"
#include "saru_cxx.h"

class Fixture
{
  MyStruct s_;
  Fixture() : s_() {}
  void test_A_is_B()
  {
     SARU_ASSERT_EQUAL( s_.A(), s_.B() );
  }

  void test_C_is_7()
  {
     SARU_ASSERT_EQUAL( 7, s_.C() );
  }
};

int main()
{
   saru::TestLogger logger;
   SARU_TEST( Fixture:: test_A_is_B, logger );
   SARU_TEST( Fixture:: test_C_is_7, logger );
   logger.printSummary();
   return logger.allOK()?0:1;
}

または、C ++ヘッダーの動作が気に入らない場合は、最小限の困難で他の単体テストライブラリと統合できるはずです。

ただし、PHPとPythonで記述されたテストも実行されます。したがって、saruを使用して完全な機能テストを設定できます。または、テストスイートの一部としてコードに対してlintのようなものを実行することもできます。

于 2010-01-11T08:35:32.063 に答える
2

CppUnit は、おそらく C++ の最初の単体テスト フレームワークです。これは、有名な Java フレームワークである Junit の直接ポートです。これにより、Junit からの移行が容易になりますが、フレームワークがやや重くなり、RAII などの C++ 機能を利用できなくなります。それが、CppUnitLite、NanoCppUnit などの軽量バージョンが作成された理由です。CppUnit2 は、他の改善の中でも特にこれを改善するはずでした。

Tut は以前はヘッダーが 1 つだけの非常に軽量でしたが、最新バージョンではライブラリが導入されました。

「標準」フレームワークに関する限り、そのようなものはなく、C++1X では定義されていません。

于 2010-01-11T06:11:07.547 に答える
1

最小限の C++ ユニット テスト ライブラリは次のとおりです: https://github.com/vahidk/minimal-cpp-test

構文は Google テスト ライブラリと非常によく似ていますが、ヘッダーのみのライブラリであるため、プラットフォーム間での移植が容易です。

最小限の単体テストは次のとおりです。

#define DEFINE_TEST_MAIN    
#include "test.h"
TEST(GroupName, TestName) {
  EXPECT_EQ(1 + 2, 3);
}

そして最小限の備品:

class ClassName : public cyrus:Test {
public:
  void Setup() override { 
    x = 5;
  }
  int x;
}

Test_F(ClassName, Test1) {
  EXPECT_EQ(x, 5);
}

お役に立てれば。

于 2015-03-02T22:16:16.510 に答える
1

以下は、C++ 単体テスト用のソリューションのみを含む単一のヘッダー ファイルです: https://gitlab.com/cppocl/unit_test_framework

ここで使用する簡単な例ですが、フィクスチャ (セットアップとティアダウン)、メモリ リークのテストの失敗、パフォーマンスのテストの失敗もあります (この機能は他では見たことがありません)。

#include "test/Test.hpp"

TEST(MyTest)
{
    int a = 1;
    int b = 2;
    CHECK_EQUAL(a + b, 3);
}
于 2018-06-05T21:36:23.267 に答える
0

これがユニットテストライブラリのリストです。

http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C.2B.2B

しかし、私が知る限り、cppunitが最も人気があります。

于 2010-01-10T21:31:58.987 に答える