如何对用Python编写的GDB漂亮打印机进行单元测试?

时间:2012-10-13 05:28:17

标签: python unit-testing gdb pretty-print

我使用GDB Python接口为一个(C)结构编写了一个漂亮的打印机,它在软件版本之间有变化的趋势。由于格式波动,我试图使打印机足够动态以适应并始终尝试打印有用的东西,而不是抛出Python异常。

目前我需要支持两种主要格式,但将来可能会有更多格式。我想为打印机编写一些单元测试,以避免从不同版本手动加载coredump来测试它。

我想也许我可以在调试会话中序列化gdb.Value并在我的单元测试中加载它们但是我无法做到(pickle不适用于gdb.Value)。核心转储非常大,因此将它们与漂亮的打印机和脚本GDB一起存储用于测试不是一种选择。

如何在不保留大量核心转储的情况下对我漂亮的打印机进行单元测试?

1 个答案:

答案 0 :(得分:2)

  

如何在不保留大量核心转储的情况下对我漂亮的打印机进行单元测试?

保留小核心转储: - )

假设你有struct Foo你有一个漂亮的打印机,并且不断发布。

编译以下程序:

#include <stdlib.h>
#include "foo.h"
int main()
{
   struct Foo f;
   // initialize f with some values
   abort();
}

编译并运行此程序,将其存储为foo-v2foo-v2.core(假设您现在位于struct Foo的第2版)。核心应该很小。

现在结帐foo.h对应于您的修订控制系统struct Foo的版本1(您执行使用版本控制系统,对吗?)。重建并重新运行该程序,将其存储为foo-v1foo-v1.core

现在,在每个版本中,您只需重建/重新运行上述程序,并将GDB漂亮打印机的输出与预期结果进行比较。如果它仍然可以正常工作,那么你就完成了。如果没有,struct Foo必须已更改,您需要更新漂亮的打印机。

将新的二进制文件和核心保存为foo-v3foo-v3.core,更新漂亮的打印机,然后针对所有foo-vNfoo-vN.core对进行测试(对于测试本身,使用GDB源代码附带的GDB单元测试框架。