Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于PyType_Ready和PyObject_New这样的Python/C API,一个单元如何测试错误条件的处理?_Python_C_Unit Testing - Fatal编程技术网

对于PyType_Ready和PyObject_New这样的Python/C API,一个单元如何测试错误条件的处理?

对于PyType_Ready和PyObject_New这样的Python/C API,一个单元如何测试错误条件的处理?,python,c,unit-testing,Python,C,Unit Testing,对用C编写的Python扩展模块进行单元测试是相当简单的(如果繁琐的话),包括许多Python/C API(如PyArg_ParseTuple)的错误案例。例如,启动实现Python函数或方法的C函数的惯用方法如下所示: if (!PyArg_ParseTuple(args, "someformat:function_name")) { return NULL; } if (PyType_Ready(&Some_Extension_Structu

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

    if (!PyArg_ParseTuple(args, "someformat:function_name")) {
        return NULL;
    }
    if (PyType_Ready(&Some_Extension_Structure) < 0) {
        return 0;
    }
成功的例子可以通过使用正确数量和类型的参数调用函数进行单元测试。也可以通过先使用错误数量的参数调用函数,然后使用正确数量的参数调用函数,但传递错误类型的值来测试失败情况。这将导致C代码的完整分支测试覆盖率

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

    if (!PyArg_ParseTuple(args, "someformat:function_name")) {
        return NULL;
    }
    if (PyType_Ready(&Some_Extension_Structure) < 0) {
        return 0;
    }
一个单元如何测试这种负面情况(特别是考虑到在执行单个单元测试方法的过程中,
PyObject\u New
可能被多次使用)

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

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


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

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


创建您自己的图层,提供
PyType\u Ready
PyObject\u New
。让它们传递给C API函数,除非某些控件(可能是环境变量)指示它们不要这样做。它们可以造成您想要的任何混乱,并测试代码的反应。

谢谢。双重测试的问题在于C不太适合Python中如此简单的“猴子补丁”,Python/CAPI似乎也没有提供注入替代实现的方法。如果我要走这条路,我需要一个特殊的多进程测试运行程序,可以适当地滥用链接器;我需要一种方法来确定每个假函数中的调用上下文(因此我只滥用我自己的代码,而不是Python运行时的其余部分),等等。我可以看到它,但这条路看起来漫长而艰难。。。我真的想要一些更容易实现的聪明的解决方案/是的,C像那样易碎。我的意思是根据环境变量编写一个调用PyType_Ready或返回错误的函数。您必须将“双重测试”代码混合到真正的代码中,并始终保留它。没有真正的双重测试那么优雅,但可以让您测试代码。