如何对模板代码的故意编译错误进行单元测试

时间:2011-09-02 10:46:01

标签: c++ unit-testing templates

请注意,这不是How write a unit test for verifying compiling error?的副本,因为我不关心测试外部库或编译器本身的正确性。

在C ++中,特别是在处理模板时,采用阻止某些特定代码编译的技术。由于这些问题可能会变得复杂,确保特定代码片段确实会产生编译器错误的最佳方法是什么?

由于测试甚至不应该编译,你不能依赖之类的东西,所以我想它应该集成在构建系统中?这些问题通常如何处理?

4 个答案:

答案 0 :(得分:11)

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

  • gcc使用DejaGnu,它建立在expect之上,shUnit2本身建立在Tcl之上。
  • 如果您使用shell脚本(可能更容易,DejaGnu可能有点过分),您可能需要查看{{3}}。
  • Perl的Test::Harness系统应该很容易使用。
  • 毕竟,从C ++运行进程并没有那么多工作,所以编写一个函数来尝试在给定的字符串上调用编译器并检查它是否输出错误的行,你预期它不会那么难您可以将其集成到其他基于boost.test的测试中。

答案 1 :(得分:4)

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:2)

使用val displayPropertyPrice = Transformations.map(selectedProperty) { application.applicationContext.getString( when (it.isRental) { true -> R.string.display_price_monthly_rental false -> R.string.display_price }, it.price) } negative feature表达式测试c++20,因此可以保证某些构造将无法编译:

简单示例

下面,我检查静态断言中函数requires的重载是否存在,当与测试框架一起使用时,应在其中一个运行时测试中使用布尔值,以免阻止其他测试编译:

func

该代码在Compiler Explorer中可用:https://godbolt.org/z/direWo