假设我正在编写一个由函数模板
组成的模板库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.
答案 0 :(得分:5)
编写一个产生编译器的测试用例......这就是例如autoconf
测试是否存在特征。
答案 1 :(得分:2)
我不明白为什么在运行时失败比在编译时失败更可取。您在单元测试过程中失败越早越好。您的单元测试最好不要编译而不是失败。它甚至更容易修复,事实上它可能甚至不会致力于源代码控制。您的单元测试应该只包括这四行并在结尾处断言为真。请注意,这不是我自己做的方式。
答案 2 :(得分:2)
C ++模板是一个编译时功能。在许多情况下,它们会在编译时通过设计失败。你根本无法绕过这个without doing something really crazy。
但是,您也想要知道您的模板特化是正确的,因为特化会覆盖您从模板获得的行为。所以测试专业化。但是要意识到你永远不会绕过模板的编译时间方面。
答案 3 :(得分:1)
根据您在此处尝试测试的内容,检查事物是否可以编译是您可以执行的唯一明智的测试。
测试不应该是为了测试,而是为了确保功能正确。如果你想在你的课程周围进行适当的测试,你应该编写测试来验证模板的功能,并使用它可以编译的所有4个不同的类。