1

CxxTestを使い始めたばかりで、std::vectorが正しくソートされているかどうかをテストしたいと思います。これまでの私のテストは次のとおりです。

void testSort() {
  std::sort(vec.begin(), vec.end()); // This could be any sorting function

  for (unsigned int i = 0; i < vec.size() - 1; ++i) {
    TS_ASSERT(vec[i] <= vec[i + 1]);
  }
}

明らかに、CxxTestはアサーションを提供しませんTS_ASSERT_SORTEDが、カスタムアサーションを作成する方法はありますか?それは私がこれを行うことを可能にするでしょう:

void testSort() {
  std::sort(vec.begin(), vec.end()); // This could be any sorting function

  TS_ASSERT_SORTED(vec);
}

このように記述されていると、テストの意図を確認するのが非常に簡単になります。

CxxTestユーザーガイドを調べましたが、このようなカスタムアサーションを記述できるかどうかわかりませんでした。別の方法として、クラスIsSortedを作成し、そのを実装することもできますoperator()。次に、次のようなテストを作成できます。

void testSort() {
  std::sort(vec.begin(), vec.end()); // This could be any sorting function

  TS_ASSERT_PREDICATE(IsSorted, vec);
}

これが正しいアプローチだと思います。ただし、これを行う場合はclass IsSorted、テストスイートとは別に、の定義を独自のヘッダーファイルに配置する必要がありますか?特にこのフレームワークでは、単体テストに関連するベストプラクティスを理解しようとしています。

setUp()最後の質問:メソッドまたはテスト自体でベクトルを並べ替える必要がありますか?

4

3 に答える 3

1

cxxtestヘッダーファイルを変更することにより、独自の新しいマクロをいくつか追加できます。結局のところ、それはオープンソースです!これらのマクロからテストが正しく失敗することを確認してください(cxxtestの動作と互換性のないmartiertによるここでの例とは異なり、TS_ASSERT_EQUALSの機能を参照してください)。

于 2011-01-23T22:27:58.790 に答える
0

まあ、アサーションは単なるプリプロセッサマクロなので、おそらく好きなように実装してから、マクロを#defineすることができます。TS_ASSERT_後でコードを読む人を混乱させないように、で始まらない名前を使用する方がよいと思います。

述語バージョンは、私にはそれほど不器用に見えません-私はおそらくそれを使用するか、テストしているクラスにcheck_メソッドを実装し、テストからそれを呼び出します。とにかく、実行時のデバッグとロギングのためにクラスの内部構造を検証するメソッドが必要になることがよくあります...

于 2009-11-23T20:15:18.967 に答える
-1

#defineを使用できます


#define TS_ASSERT_PREDICATE( vec )\
    std::vector tmp = vec;\
    for(int i = 0; i  tmp[i+1]) \
            return false;\ 
    }\ 
    return true;\ 
}
于 2009-11-23T19:50:32.373 に答える