C++ 如何为C+编写测试+;模板?
假设我正在编写一个由函数模板组成的模板库C++ 如何为C+编写测试+;模板?,c++,templates,testing,C++,Templates,Testing,假设我正在编写一个由函数模板组成的模板库 template<T> void f(T); 根据您在这里尝试测试的内容,检查对象是否可以编译是您可以执行的唯一明智的测试 测试不应该是为了测试,而是为了确保功能的正确性。如果您想在类周围进行适当的测试,您应该编写测试,用它可以编译的所有4个不同类验证模板的功能。我不明白为什么运行时失败比编译时失败更可取。在单元测试过程中失败越早越好。与其失败,不如让单元测试不编译。它更容易修复,事实上,它甚至可能不会致力于源代码控制。您的单元测试应该只包
template<T> void f(T);
根据您在这里尝试测试的内容,检查对象是否可以编译是您可以执行的唯一明智的测试
测试不应该是为了测试,而是为了确保功能的正确性。如果您想在类周围进行适当的测试,您应该编写测试,用它可以编译的所有4个不同类验证模板的功能。我不明白为什么运行时失败比编译时失败更可取。在单元测试过程中失败越早越好。与其失败,不如让单元测试不编译。它更容易修复,事实上,它甚至可能不会致力于源代码控制。您的单元测试应该只包括这四行,并在末尾断言true。注意这不是我自己做的方式。编写一个生成编译器的测试用例。。。例如,
autoconf
就是这样测试功能是否存在的。C++模板是一种编译时功能。根据设计,在许多情况下,它们会在编译时失败。你根本无法回避这一点
但是,您还需要知道您的模板专门化是正确的,因为专门化覆盖了您从模板获得的其他行为。因此,测试专业化。但是要意识到,您永远无法绕过模板的编译时方面。因为我们希望捕获所有功能规范,并将其捕获为单元测试,作为项目进度报告。如果测试程序甚至无法编译,那么就不会报告任何测试——即使那些通过的测试也是如此。也许您应该将测试程序分解为多个程序,每个测试一个。这将避免您上面描述的问题。+1:编译器也是这样测试的:p您可能想看看LLVM/Clang中的
lit
框架,它允许在测试旁边的内联注释中指定预期的错误。
template<> void f(A);
template<> void f(B);
template<> void f(C);
template<> void f(D);
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.