14

テンプレート化されたメソッド、クラス、および関数を C++ で単体テストする良い方法を探しています。単一の型を使用してテストするだけでは十分ではなく、単体テストを複製して型を置き換えるだけでは適切ではないと感じています。

より具体的には、Matrix クラスに取り組んでおり、Boost のユニット テスト フレームワークを使用しています。マトリックスは、さまざまなタイプで機能します。基本型がメインですが、具象型にも対応してほしいです。

これは学習目的で行っていることに注意してください。そのため、既存のマトリックス実装を使用していません。

4

4 に答える 4

12

ブーストテストには、boost :: mpl::listの各タイプのテンプレートでテストを実行するマクロBOOST_AUTO_TEST_CASE_TEMPLATEがあります。

template<typename T>
T Add(T lh, T rh)
{
   return lh + rh;
}

typedef boost::mpl::list<int, float> test_types;

BOOST_AUTO_TEST_CASE_TEMPLATE(Add_1Plus2_Is3, T, test_types)
{
    T result = Add(T(1), T(2));
    BOOST_CHECK_EQUAL(T(3), result);
}

http://www.boost.org/doc/libs/1_48_0/libs/test/doc/html/utf/user-guide/test-organization/auto-test-case-template.html

于 2012-04-20T13:31:23.677 に答える
3

josuegomes と VJovic に同意します。コードの重複を最小限に抑える 1 つの方法は、単体テスト ロジックを使用してテンプレート化された関数を作成し、これを異なる型引数で呼び出すことだと思います。このようにして、必要なタイプごとにテンプレート化された単体テスト関数を 1 回呼び出しながら、すべての Matrix 単体テスト ロジックを 1 か所に配置できます。

ただし、そうするのはやり過ぎかもしれません。テストのロジックの量に依存すると思います。

于 2012-04-20T13:32:36.107 に答える
0

単体テストの要点は、コードのすべてのブランチをカバーすることです。異なるタイプでのテストが異なるブランチをカバーする場合は、タイプ固有の単体テストを追加するのが理にかなっています。それ以外の場合は、コピーアンドペーストです。

于 2012-04-20T13:25:17.967 に答える
0

テンプレートを単体テストする場合は、考えられるすべてのタイプを使用して、または十分と思われるまで、テンプレートクラスを単体テストする必要があります。回避する方法はありません。

クラスはintで動作する可能性がありますが、floatでは失敗します。

テンプレートが特定のタイプで使用されることを意図していない場合は、コードにstatic_assertを追加する必要があります。

于 2012-04-20T13:26:19.200 に答える