2011-09-02 57 views
35

请注意,这不是How write a unit test for verifying compiling error?的重复,因为我不关心测试外部库或编译器本身的正确性。如何单元测试模板代码故意编译错误

在C++中,特别是在处理模板时,通常使用阻止某些特定代码被编译的技术。由于这些可能会变得复杂,确保特定代码段确实会产生编译器错误的最佳方法是什么?由于测试不应该被编译,你不能依赖诸如之类的东西,所以我猜它应该被集成到编译系统中?这些问题通常如何处理?

+0

我不明白..你能为你想测试的东西提供一个例子吗? –

+0

例如,如果某种类型没有可用的专门化,或者如果某种类型不符合某些必要条件,或者通常测试“boost :: enable_if'等 – UncleZeiv

+0

那么只需编写一个不应编译的测试用例,然后检查它是否没有编译..也许搜索相应的错误信息以确保它不会编译* *原因。 –

回答

10

做在类似的方式编译器编写测试。您将在某些脚本语言(shell,perl,tcl等)中拥有一些测试代码,这些代码将在给定的代码片段上运行编译器,并检查是否编译了正确的代码,而不是正确的代码。

  • GCC使用DejaGnu,这是建立在expect之上,这本身就是建立在Tcl的顶部。
  • 如果你使用shell脚本(可能更简单,DejaGnu可能是过度杀毒),你可能想看看shUnit2
  • Perl的Test::Harness系统应该是最容易使用的。
  • 毕竟,从C++运行进程并没有太多的工作,所以编写一个函数来试图在给定的字符串上调用编译器,并检查它是否输出错误的行,你认为它不会那么困难,你可以将它集成到其他基于boost.test的测试中。
3

您将不得不依靠外部框架来运行一组编译测试,例如, makefiles或hudson作业,并检查编译器输出或编译器工件。如果编译应该失败,那么在编译时不应该有文件的目标文件。我猜你可以为哈德森写一个插件来做这件事,或者是一个简单的批处理脚本,它运行一个makefile,编译所有应该失败或成功的测试文件,并相应地标记成功或失败。

在最简单的情况下,您只需检查'.o'文件的存在以查看测试是否成功;在更复杂的情况下,您可能需要查看编译器输出并验证产生的错误同意你期待的错误。这将取决于您正在使用的编译器。

走向更深层次的原因可能意味着写一个编译器扩展做到这一点(LLVM可能能够处理你所要求的)

+0

绝对不分开[Jenkins](http://jenkins-ci.org/)(名称“哈德森”卡住在Oracle)工作。我们正在谈论10行代码片段。 –