【问题标题】:How can I unit test a GDB pretty-printer written in Python?如何对用 Python 编写的 GDB 漂亮打印机进行单元测试?
【发布时间】:2012-10-03 22:18:33
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python unit-testing gdb pretty-print


    【解决方案1】:

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

    保留小的核心转储:-)

    假设您有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 版)。核心应该很小。

    现在从您的版本控制系统中签出与struct Foo 版本1 相对应的foo.h(您确实使用版本控制系统,对吗?)。重建并重新运行程序,将其存储为foo-v1foo-v1.core

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

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

    【讨论】:

    • 我正在考虑这是个好主意。最好我想避免在 Python 之外有依赖关系。
    • @DavidHolm 您想消除哪种依赖?我不相信有可能消除存储 foo-vN 和 foo-VN.core 的需要(但也许你可以根据需要重新生成它们)。 如果可以将漂亮打印机的输出与“黄金”输出进行比较,消除对 GDB 测试框架的依赖很容易。
    • 对 GDB 的依赖。现在 GDB 7 不是我们产品的官方支持版本,所以我使用我自己的 GDB。有些人正在使用我的构建,其他人有他们自己的构建,所以如果测试代码独立于它会在路径中找到的任何版本的 GDB,我会更喜欢它。
    • @DavidHolm 我不太明白:如果您希望您的测试使用特定版本的 GDB,为什么不能将 /path/to/specific/build/of/gdb 硬编码到测试中?
    • 我当然可以做到,我想我必须这样做。只是如果实现更“便携”,我会更喜欢。 ^^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多