如何为C++模板编写测试?

6
假设我正在编写一个模板库,其中包含一个函数模板。
template<T> void f(T);

要求它能够与预定义的 A、B、C 和 D 类一起使用,例如,以下代码必须编译通过:

template<> void f(A);
template<> void f(B);
template<> void f(C);
template<> void f(D);

有什么测试框架可以帮我编写测试用例,在运行时捕获需求,而不是在测试代码编译期间失败?换句话说,我希望该框架能够在运行时实例化模板,并在其中子集失败时生成格式良好的错误报告。

我知道我可以放弃测试框架,只需编写一个包含上述4行的简单cc文件。但我希望将这个需求纳入常规标准测试用例中,以生成测试状态报告。例如:

test f works with A: passed.
test f works with B: passed.
test f works with C: failed!  Cannot cast type C!
test f works with D: passed.

3 of 4 tests passed.
1 of 4 tests failed.
4个回答

5
编写一个测试用例来生成编译器...这就是例如autoconf检测功能存在的方式。

+1:编译器也是这样测试的:p您可能想看一下LLVM/Clang中的“lit”框架,它允许在测试旁边的注释中指定预期错误。 - Matthieu M.

2

我不理解为什么在运行时失败比在编译时失败更可取。你越早在单元测试过程中失败越好。最好使您的单元测试无法编译而不是失败。这甚至更容易修复,实际上它可能连提交到源代码控制都不会。您的单元测试应该包括这四行并在结尾处断言为真。请注意,这不是我自己做事情的方式。


因为我们希望将所有功能规格作为单元测试捕获,以作为项目进度的报告。如果测试程序甚至无法编译,则不会报告任何测试结果——即使是已通过的测试。 - kirakun
也许你应该将测试程序分解成多个程序,每个测试一个程序。这样可以避免上述描述的问题。 - Jeremy Friesner

2

C++模板是一种编译时特性。在许多情况下,它们将在编译时失败,这是设计上的问题。你无法绕过它,除非做一些非常疯狂的事情

但是,您还需要知道您的模板专业化是否正确,因为专业化将覆盖您从模板中得到的行为。因此,请测试专业化。但请意识到您永远无法避开模板的编译时间方面。


1

根据您在此处尝试测试的内容,检查该事物是否可以编译是您可以执行的唯一明智测试。

测试不应仅为了测试而进行,而应确保功能正确性。如果您想在类周围拥有适当的测试,则应编写测试以验证模板与其可以编译的所有4个不同类的功能。


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