gpt4 book ai didi

python - 一个单元测试如何处理 PyType_Ready 和 PyObject_New 等 Python/C API 的错误条件?

转载 作者:太空狗 更新时间:2023-10-30 00:15:21 26 4
gpt4 key购买 nike

单元测试用 C 语言编写的 Python 扩展模块相当简单(如果乏味),包括许多 Python/C API(例如 PyArg_ParseTuple)的错误案例。例如,启动实现 Python 函数或方法的 C 函数的惯用方式如下所示:

    if (!PyArg_ParseTuple(args, "someformat:function_name")) {
return NULL;
}

可以通过使用正确的参数数量和类型调用函数来对成功案例进行单元测试。也可以通过首先使用错误数量的参数调用函数,然后使用正确数量的参数但传递错误类型的值来测试失败情况。这导致 C 代码的完整分支测试覆盖。

但是,尚不清楚如何为其他 Python/C API 执行否定路径。在 C 扩展中开始模块初始化的惯用方法如下所示:

    if (PyType_Ready(&Some_Extension_Structure) < 0) {
return 0;
}

如何使 PyType_Ready 失败?同样,用于分配扩展类型的新实例的 C 函数经常使用类似 PyObject_New 的 API:

    self = PyObject_New(Some_Structure, &Some_Extension_Structure);
if (self == NULL) {
return NULL;
}

一个单元如何测试这种负面情况(特别是考虑到 PyObject_New 在单个单元测试方法的执行过程中可能使用了很多次)?

似乎可以构建一个通用解决方案,依靠动态链接器技巧(例如 LD_PRELOAD)来提供这些 C API 的伪造,这些伪造可以在正确的时间以正确的方式被引导失败。不过,构建这样一个系统的成本似乎有点高不可攀。是否已有其他人完成并提供了结果?

是否有特定于 Python/C 的技巧可以使此测试更容易?

我是否应该完全按照其他思路思考?

最佳答案

这是测试替身的明显案例(例如,模拟)。由于 Python C API 不提供任何伪造内存不足情况的工具,您必须自己动手。

创建您自己的层,提供 PyType_ReadyPyObject_New。让它们传递给 C API 函数,除非某些控件(可能是环境变量)指示它们不要这样做。它们可以造成您想要的任何困惑,并测试您的代码的 react 。

关于python - 一个单元测试如何处理 PyType_Ready 和 PyObject_New 等 Python/C API 的错误条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9264299/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com