2016-08-11 149 views
2

我有一个项目涉及一些(相当简单)的C代码生成作为构建系统的一部分。实质上,我有一些版本信息与我想在我的二进制文件中公开的项目(嵌入式C)相关联,以便我可以轻松确定将哪些固件版本编程到特定设备以进行调试。单元测试C生成python代码

我正在写一些简单的python工具来做到这一点,我想确保它们经过了彻底的测试。总的来说,这是相当直接的,但我不确定代码生成部分的最佳策略是什么。从本质上讲,我想确保生成的文件都:

  • 的语法正确
  • 包含必要的信息

第二,我可以(我相信)实现在相当程度上与正则表达式匹配。然而,第一个是更重要的任务。我大概可以使用像pycparser这样的东西,并检查产生的AST来完成这两个目标,但这似乎是一个不必要的重量级解决方案。

编辑:我的构建层次的数据流程图

dataflow diagram

+2

正则表达式不是答案。 –

+1

请您[编辑您的问题](https:// stackoverflow。com/posts/38905560/edit),以包含C/Python/binary/codegen部分如何组合在一起的数据流图,以及您试图验证哪个阶段的输出?此外,您是否试图详尽测试构建过程的某些方面,还是在您刻录到Flash之前尝试验证您即将刻录的映像是否具有基于C或Python源代码的信息? (或别的?)谢谢! – cxw

+0

@cxw添加了一个基本图。这只是代码生成的单元测试,所以我关心的是头文件/源文件对中存在所需的信息,而且这个对是有效的C(本身不会导致构建失败) –

回答

2

谢谢你的图!既然你没有测试覆盖范围,如果是我,我只需编译生成的C代码,看看它是否工作:)。你没有提到你的工具链,但是在类Unix环境中,gcc <whatever build flags> -c generated-file.c || echo 'Oops!'应该足够了。

现在,它可能是生成的代码不是一个独立的编译单元。没有问题:写一个垫片。例如shim.c

#include <stdio.h> 
#include "generated-file.c" 
main() { 
    printf("%s\n", GENERATED_VERSION); //or whatever is in generated-file.c 
} 

然后gcc -o shim shim.c && diff <(./shim) "name of a file holding the expected output" || echo 'Oops!'应该给你一个基本的测试。 (<()是bash process substitution。)持有预期结果的文件可能已经存在于您的git仓库中,或者您可能可以使用Python例程将其写入磁盘。

编辑2即使您的实际工具链不适合自动化,该方法也可以工作。要测试代码的语法有效性,即使您为目标处理器使用不同的编译器,也可以使用gcc。例如,使用gcc -ansi进行编译将禁用一些GNU扩展,这意味着与gcc -ansi编译的代码更有可能在另一个编译器上进行编译,而不是使用GNU扩展的全开启编译的代码进行编译。请参阅"C Dialect Options"上的gcc页面,了解您可以使用的所有不同口味(ditto C++)。

编辑顺便说一句,这是同样的方法GNU autoconf使用:写一个小的测试程序到磁盘(autoconf的称之为conftest.c),编译它,并查看是否编译成功。测试程序(最好)是测试一切是否正常所需的最低限度。根据Python的复杂程度,您可能需要使用各自不同的垫片测试生成的代码的几个不同方面。