2008-12-23 123 views
13

我在实现我的库时使用了函数和类模板。 到目前为止,我刚刚在库单元测试(CppUnit)中实例化了一个模板, ,然后继续对其进行测试,几乎与其他任何常规类或函数一样。单元测试C++模板

最近我一直在计划将一些模板也添加到库API中。 良好的界面当然是最重要的事情,模板与否。 通过精心设计和实施的模板,您可以(如果不是完全防止的话)至少使用户更难以在脚中自拍。 任何我觉得单元测试公共模板需要更严格一点, 相比纯粹的内部模板。

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

回答

5

对于初学者,单元测试您的模板代码与您认为最有可能为用户提供的参数。我经常做一些事情模板“以防万一”,并且最终决不会使用任何东西,除了我在编写原始代码时想到的一种类型。因此,在这种情况下,测试最有可能的情况涵盖所有情况!

如果您觉得您需要测试更多,请使用与第一个参数尽可能不同的另一个模板参数。可能不需要再次测试所有方法。有些方法可能实际上不依赖于模板参数。

0

在单元测试中Instanciating模板是测试模板类。

有什么风险?他们取决于你的图书馆正在做什么与模板参数;考虑可能出现的问题取决于用于实例化模板类的类并编写新的测试。

至少你会让你的单元测试环境准备好再现任何会被报告的问题。

4

我有一个额外的建议。除了对每个模板进行单元测试之外,还要检查将帮助限制模板参数的潜在广泛范围,这些参数可能是您的库用户可能尝试传递给模板的模板参数。

例如:假设您只使用类型参数“string”和“char”来测试模板。您无法证明其他类型的参数对于此特定模板会产生问题,但出于某种原因,您“怀疑”其他未经测试的类型参数存在问题。

在像上述例子那样的情况下,它并不一定意味着你应该详尽地测试其他类型的参数。相反,您有一个案例可能意味着您应该使用一些编译时模板元编程技术来确保您的模板不会与其他任何参数一起使用,而是使用“string”和“char”。

一个资源:

Modern C++ Design -- by Andrei Alexandrescu

在这本书很早就撰文表示的例子如:

  • 如何做一个模板,将自我强制执行其第一类型arg是比第二类型arg小的类型

  • 如何在编译时

“现代C++设计”(尽管它相当广泛/模糊的称谓)是模板编程技术相当先进的勘探检测兑换和继承。

+0

约束模板类型参数很重要,+1表示提及它。不这样做就像所有的函数参数类型为void * – Iocio 2008-12-25 21:09:06

3

Boost.Test具有便于根据模板参数集测试模板的组件。