Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何为C+编写测试+;模板?_C++_Templates_Testing - Fatal编程技术网

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.