2016-11-18 2 views
1

ユニットテストテンプレートとして何かがあるかどうか疑問に思っていました。私のニーズを説明しましょう。高度にテンプレート化されたライブラリのユニットテスト

私は非常にテンプレートライブラリを持っています。私はsfinae型の形質をたくさん持ち、static_assertをいくつか持っています。

私がテストしたいのは、sfinae型の特性の妥当性と、static_assertが正しいものを投げているかどうかをテストすることです。私のカバレッジが何であるかを知ることはすばらしいことです。

template<typename T> 
using false_v = !std::is_same<T, T>::value; 

// Here are my types traits 
template<typename T, typename... Args> 
struct SomeCondition1 { /* ... */ }; 

template<typename T, typename... Args> 
struct SomeCondition2 { /* ... */ }; 

// This is a master type trait, that test every others 
template<typename T, typename... Args> 
using Conditions = std::integral_constant<bool, 
    SomeCondition1<T, Args...>::value && SomeCondition2<T, Args...>::value 
>; 

// This is the function that is call when everything is okay. 
template<typename T, typename... Args, 
    std::enable_if_t<Conditions<T, Args...>::value, int> = 0> 
void doThing(Args...) {} 

// These function are called only to trigger 
// static asserts to give the user a diagnostic to explain what's wrong. 
template<typename T, typename... Args, 
    std::enable_if_t<SomeCondition1<T, Args...>::value && !SomeCondition2<T, Args...>::value, int> = 0> 
void doThing(Args...) { 
    static_assert(false_v<T>, "Error, SomeCondition2 not met"); 
} 

template<typename T, typename... Args, 
    std::enable_if_t<!SomeCondition1<T, Args...>::value && SomeCondition2<T, Args...>::value, int> = 0> 
void doThing(Args...) { 
    static_assert(false_v<T>, "Error, SomeCondition1 not met"); 
} 

template<typename T, typename... Args, 
    std::enable_if_t<!SomeCondition1<T, Args...>::value && !SomeCondition2<T, Args...>::value, int> = 0> 
void doThing(Args...) { 
    static_assert(false_v<T>, "Error, both conditions not met"); 
} 

私は形質はOKだったらテストについて考えていた、と右の静的アサートは、私の場合のためにスローされた場合:ここでは

は私のコードがどのように見えるかの例です。間違った静的なアサーションがトリガされた場合、それはバグです。私はそれをテストできるようにしたいと思います。すべてのコンパイラのすべてのケースをカバーし、手作業ですべてのメッセージをチェックしようとすると、実際には時間がかかりエラーが発生しやすくなります。

答えて

1

引数の型の範囲のためのユニットテストテンプレートコードの問題は かなりよく、そのTYPED TESTS featureType-Parameterized Tests特徴とgoogletest によって対処されます。

これらの機能の制限は、ただ1つのパラメータを持つテンプレート のテストにただちに適用できることです。しかし、この制限を回避することは難しくありません。 this questionを参照してください。

しかし、を テンプレートコードに入力しても問題が解決しない場合はありません。もちろん、その種のテストの特別な障害は、 static_assertがコンパイルエラーで起動することです。だから、それが正しく発動すれば、 何もできません。を実行してそれが実行されることを示します。

これは数年前に私を悩ませました。私はHow to write runnable tests of static_assert?を投稿し、これまでのところ を受け取りました(最近はC++ 14と現在のコンパイラ用に更新されています)。

これらのリソースと手法を組み合わせると、探しているソリューションが得られるはずです。

関連する問題