单元测试高度模板化的库
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");
}
我正在考虑测试如果性状是好的,如果正确的静态断言抛出我的情况。如果错误的静态断言被触发,那就是一个bug,我希望能够测试它。试图覆盖所有编译器的所有情况并手动检查每条消息非常耗时且容易出错。
对参数类型范围的模板代码进行单元测试的问题是googletest很好地解决了这个问题具有TYPED TESTS
特性和Type-Parameterized Tests
特性。
这些特性的一个限制是它们只能立即应用于测试只有一个参数的模板。但要解决这个限制并不难:请看这个问题和公认的答案。
这些都没有帮助,然而,测试static_assert
的正确性的进一步问题模板代码。当然,这种测试的特殊障碍是static_assert
因编译失败而着火;所以如果它触发了,不管正确与否,没有什么可以执行来显示它是这样做的。
几年前这也困扰着我。我张贴了如何编写static_assert的可运行测试?也写出了目前唯一的答案已收到(最近针对c++ 14和当前编译器更新)。
结合这些资源和技术应该产生您正在寻找的解决方案。
相关文章:
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- VC++本机单元测试,找不到调试符号
- 用于交叉编译和CMake的预处理器宏的单元测试
- C++ 用于单元测试的模板模板
- 提升 1.64 单元测试编译失败
- 单元测试欧拉到四元数实现失败
- 运行 C++ 单元测试时LNK2005链接错误
- 禁用自动捕获 Googletest 单元测试中的C++异常
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- 使用 Google Test 对自定义断言函数进行单元测试
- 如何将我的 CMake 项目配置为运行所有单元测试?
- 在Qt C++单元测试中动态加载QQuickWindow而不是QQuickWidget
- MS 本机单元测试 - 断言::线程失败不起作用
- 如何获取 CMake 单元测试的相对路径?
- QTimer 超时不会在单元测试中触发
- 如何在提升构建中设置环境变量以进行提升单元测试框架?
- 在 AtMega32a 上运行的C++的单元测试
- 使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
- 单元测试高度模板化的库