繁体   English   中英

单元测试高度模板化的库

[英]Unit testing highly templated library

我想知道是否有作为单元测试模板的东西。 让我解释一下我的需求。

我有一个高度模板化的库。 我有很多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");
}

我正在考虑测试这些特性是否正常,以及是否为我的案例抛出了正确的静态断言。 如果触发了错误的静态断言,那是一个错误,我希望能够对其进行测试。 试图涵盖所有编译器的所有情况并手动检查每条消息确实非常耗时且容易出错。

googletest凭借TYPED TESTS功能Type-Parameterized Tests功能,很好地解决了参数类型范围的单元测试模板代码的问题。

这些功能的局限性在于它们仅可立即应用于仅具有一个参数的测试模板。 但是解决此限制并不难:请参阅此问题和公认的答案。

但是,对于模板代码中测试static_assert的正确性的进一步问题,这些都static_assert 当然,这种测试的特殊障碍是static_assert由编译失败触发。 因此,无论是正确触发还是其他触发,您都无法执行任何操作来证明确实如此。

几年前,这也困扰着我。 我发布了如何编写static_assert的可运行测试? 并且还编写了迄今为止收到的唯一答案(最近针对C ++ 14和当前编译器进行了更新)。

结合这些资源和技术,应会找到您想要的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM