c++ - 单元测试高度模板化的库

标签 c++ unit-testing template-meta-programming

我想知道单元测试模板是否是一件事。让我解释一下我的需求。

我有一个高度模板化的库。我有很多 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 featureType-Parameterized Tests 功能。

这些功能的局限性在于它们仅立即适用于测试 只有一个参数的模板。但解决这个限制并不难: 请参阅this question以及接受的答案。

但是,这些都没有帮助解决测试 static_assert 的正确性的进一步问题 模板代码。当然,这种测试的特殊障碍是 static_assert 因编译失败而触发;所以如果它触发了,无论正确与否, 您无法执行任何操作来证明它确实有效。

几年前这也困扰着我。我发了How to write runnable tests of static_assert?还写了迄今为止唯一的答案 已收到(最近针对 C++14 和当前编译器进行了更新)。

结合这些资源和技术应该会产生您正在寻找的解决方案。

关于c++ - 单元测试高度模板化的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40681645/

相关文章:

c++ - 在 C++ 中包装 std::iterator

c++ - 我可以像 CUDA UVA 那样为 GPU、CPU 和 FPGA 使用单一地址空间吗?

javascript - 测试nodejs模块,最好的教程,方法?

c++ - 迭代模板 int

C++:为什么禁止递归模板化别名?

c++ - 提示输入 CreateFile 的凭据

C++ 类型定义不清楚

ios - bamboo xcode 单元测试 - 找不到工作区

unit-testing - 我怎样才能最好地为解析器编写单元测试用例?

c++ - 使用函数的返回类型和参数类型作为模板类型