4

CppUnitでテストする順番を指定したいです。私の調査によると、テストの順序は、コンパイラまたはリンカーのいずれか、およびそれらがファイルをどのように見つけたかによって異なります。

CppUnit で依存関係を指定するにはどうすればよいですか?

たとえば、4 本の線を持つ長方形クラスを考えてみましょう。各行には 2 つのポイント クラスが含まれます。各クラスが個別のモジュールまたは翻訳単位にあると仮定します。

struct Point
{
  int x;
  int y;
};

struct Line
{
  Point a;
  Point b;
};

struct Rectangle
{
  Line top;
  Line left;
  Line right;
  Line bottom;
};

上記のコードでは、最初に Point クラスをテストし、次に Line クラス、最後に Rectangle クラスをテストする必要があります。Line クラスまたは Point クラスに問題がある場合、Rectangle クラスをテストする理由はありません。 これは非常に単純化された例です。

複合クラスの場合、内部クラスまたはメンバー データ型クラスを最初にテストする必要があります。

各クラスにテスト クラスが関連付けられていると仮定します。各テスト クラスには、個別のファイルに独自の発行済みテスト メソッド (CppUnit リストに登録されている) があります。Lines をテストするクラスには、ポイントのテスト クラスに関する知識がありません。長方形についても同様です。これらのテスト ケース クラスがコンパイルされるとき、それらの順序はコンパイラとリンカーに依存します。

では、テスト ケースをどのように注文すればよいのでしょうか。

参考までに、私は CppUnit、wxTestRunner、および Visual Studio 2008 を使用しています。

4

1 に答える 1

5

あなたがやろうとしているのは、実際にはユニットテストではありません。「純粋な」単体テストは、実際の依存関係の代わりにモックまたは偽のオブジェクトを使用して、個々のユニット(個々のクラス)をテストすることを目的としています。クラスの相互依存関係をテストすると、それは統合テストであり、単体テストではありません。

その免責事項を邪魔しないで...

以前のすべてのスイートに合格した場合にのみ、 CPPUNIT_TEST_SUITE_NAMED_REGISTRATIONを使用して複数のスイートを作成し、各スイートを順番に実行できるようですが、これを行うには、wxTestRunnerテストランナーをハックするか置き換える必要があります。

TestSuiteの作成に関するCppUnitのページには、テストスイートを登録するための他のオプションがあります。たとえば、 CPPUNIT_REGISTRY_ADDを使用すると、スイートの階層を作成できます。これにより、順序をある程度制御できますが、1つのスイートで失敗して後続のテストを中止する方法はありません。

最後に、提案として、CppUnitはおそらく最近の最高のC++ユニットテストフレームワークではありません。私は個人的にGoogleTestのファンですが、Boost.TestUnitTest ++優れています。(この回答では、Saruという個人的なプロジェクトを紹介しています。これは、テストの注文に必要な柔軟性を提供するように思われます。)

于 2010-06-19T02:04:10.847 に答える