使用单元测试对C++模板进行测试

17

我在我的库实现中使用了函数和类模板。 到目前为止,我只在库单元测试(CppUnit)中实例化了模板, 然后几乎像任何其他普通类或函数一样进行了测试。

最近,我计划在库API中添加一些模板。 良好的接口当然是最重要的事情,无论是否使用模板。 如果设计和实现良好的模板,您可以防止用户自己朝脚射击,或者至少使其更加困难。 不管怎么说,我觉得公共模板的单元测试需要更加严格, 与纯内部模板相比。

那么,你如何对你的C++模板进行单元测试? 你有没有想出任何优雅的解决方案, 特别是针对公共库API中的模板?

4个回答

6
首先,使用您认为用户最可能提供的参数对模板代码进行单元测试。我经常会把东西做成模板“以防万一”,但最终只使用了我在编写原始代码时想到的那种类型。因此,在这种情况下,测试最可能的情况就覆盖了所有情况!
如果您觉得需要进行更多测试,请使用另一个尽可能不同于第一个参数的模板参数。可能没有必要再次测试所有方法。有些方法实际上可能并不依赖于模板参数。

5

我有一个额外的建议。除了对每个模板进行单元测试之外,还要研究一些技术,以帮助限制库用户可能尝试传递给模板的潜在巨大的模板参数。

例如:假设您只使用类型参数“string”和“char”来测试您的模板。您没有证据表明其他类型参数会对这个特定的模板造成问题,但出于某种原因,您“怀疑”其他未经测试的类型参数是有问题的。

在上述示例的情况下,并不一定意味着您应该详尽地测试其他类型参数。相反,您有一个案例,可能意味着您应该使用一些编译时模板元编程技术,以确保您的模板永远不会与除“string”和“char”之外的任何其他参数一起使用。

一个资源:

现代C++设计--Andrei Alexandrescu著

在这本书的早期,作者展示了一些示例,例如:

  • 如何制作一个模板,能够自动强制其第一个类型参数比第二个类型参数小

  • 如何在编译时检测可转换性和继承关系

《现代C++设计》(尽管标题相对宽泛)是对模板编程技术的相当高级的探索。


限制模板类型参数非常重要,提到这一点加1分。不这样做就像所有函数参数类型都是void*。 - Iocio

3
Boost.Test有一组组件方便我们测试模板,并针对一系列的模板参数进行测试。

0

在单元测试中实例化模板是测试模板类的方法。

有哪些风险?这取决于您的库对模板参数的使用方式;考虑根据用于实例化模板类的类可能出现的问题,并编写新的测试。

至少,您将拥有单元测试环境,可以重现任何被报告的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接