2017-10-17 13 views
2

私はC++ユニットテストにcatchを使用します。 私の目標は、std::arraystd::vectorを比較することです。私はこの失敗例を作りました。C++のCATCHユニットテストはstd :: arraysを比較します

#define CATCH_CONFIG_MAIN 
#include "catch.hpp" 

TEST_CASE("Vector") { 
    std::vector<double> direction = {0.1, 0.3, 0.4}; 
    std::vector<double> false_direction = {0.1, 0.0, 0.4}; 
    REQUIRE(direction == false_direction); 
} 

TEST_CASE("Array") { 
    std::array<double, 3> direction = {0.1, 0.3, 0.4}; 
    std::array<double, 3> false_direction = {0.1, 0.0, 0.4}; 
    REQUIRE(direction == false_direction); 
} 

この試験の出力はstd::vector

のチェックのためで膨張して(方向== false_direction) を必要とする: {0.1、0.3、0.4} == {0.1、0.0、0.4 }

std::array

が膨張して(方向== false_direction) を必要とする場合: {?} == {?}

実際の値と期待値を表示するにはどうすればよいですか?私はstd::arrayの違反した状態で非常に同じディスプレイをREQUIREstd::vectorのように持っています。

最新バージョンのcatch(v1.10.0)を使用しています。

答えて

1

私はキャッチヘッダ内toString法の下の問題をトレースします。 std::arrayのオーバーロードがありません。std::vectorが既にインスタンス化されています。この変更をキャッチプロジェクトにコミットします。

// already exists in the catch header 
template<typename T, typename Allocator> 
std::string toString(std::vector<T,Allocator> const& v) { 
    return Detail::rangeToString(v.begin(), v.end()); 
} 

// my modification in the catch header 
template<typename T, std::size_t _Nm> 
std::string toString(std::array<T, _Nm> const& v) { 
    return Detail::rangeToString(v.begin(), v.end()); 
} 
1

私はCatchのソースコードをチェックして、REQUIRE句をどの程度正確に実装しているのか、それがなぜ機能しないのかを確認しましたが、vectorはありません。 しかし、ここでは、回避策です:

#define COMPARE_ARRAYS(lhs, rhs) compareArrays(Catch::getResultCapture().getCurrentTestName(), __LINE__, lhs, rhs) 

template < typename T, size_t N > 
void compareArrays(const std::string & test, unsigned line, std::array<T, N> lhs, std::array<T, N> rhs) { 
    std::vector<T> lv(lhs.begin(), lhs.end()); 
    std::vector<T> rv(rhs.begin(), rhs.end()); 
    INFO("Test case [" << test << "] failed at line " << line); // Reported only if REQUIRE fails 
    REQUIRE(lv == rv); 
} 

TEST_CASE("Array") { 
    std::array<double, 3> direction = {0.1, 0.3, 0.4}; 

    std::array<double, 3> true_direction = {0.1, 0.3, 0.4}; 
    COMPARE_ARRAYS(direction, true_direction); 

    std::array<double, 3> false_direction = {0.1, 0.0, 0.4}; 
    COMPARE_ARRAYS(direction, false_direction); 
} 
+0

これは確かに機能しますが、テストコードの可読性が低下します。 – schorsch312

+0

@ schorsch312、改善されたソリューションは、よりクリーンで、再利用可能で、テスト出力情報に妥協することはありません –

1

基本的にこれは型が文字列化された方法の問題であり、そしてそのためにdocumentationは常にあります。

要約版は、指定された型のCatch::StringMakerの専門のための単純なアルゴリズム

  1. チェックがあることです。存在する場合は、それを使用します。

  2. 特定のタイプのoperator<<のオーバーロードを確認してください。存在する場合は、それを使用します。

  3. "{?}"を使用してください。 std::arrayがC++ 11の一部と一般的にあまり使用されたため

は最近まで、ではなく、std::arrayため、箱の外std::vectorための特殊化を提供キャッチ。 Since version 2.1.0 Catchは、型がコンテナのようなインターフェイスを提供するかどうかをチェックします。具体的には、begin(T)end(T)に応答します。これにより、std::vector,std::arrayなどのさまざまな種類の文字列が自動でストライピングされますが、静的配列も使用できます。

関連する問題