Modern Python projects execute computational functions using native libraries and give Python interfaces to boost execution speed; hence, testing these libraries becomes critical to the project's robustness. One challenge is that existing approaches use coverage to guide generation, but native libraries run as black boxes to Python code with no execution information. Another is that dynamic binary instrumentation reduces testing performance as it needs to monitor both native libraries and the Python virtual machine. To address these challenges, in this paper, we propose an automated test case generation approach that works at the Python code layer. Our insight is that many path conditions in native libraries are for processing input data structures through interacting with the VM. In our approach, we instrument the Python Interpreter to monitor the interactions between native libraries and VM, derive constraints on the structures, and then use the constraints to guide test case generation. We implement our approach in a tool named PyCing and apply it to six widely-used Python projects. The experimental results reveal that with the structure constraint guidance, PyCing can cover more execution paths than existing test cases and state-of-the-art tools. Also, with the checkers in the testing framework Pytest, PyCing can identify segmentation faults in 10 Python interfaces and memory leaks in 9. Our instrumentation strategy also has an acceptable influence on testing efficiency.
翻译:现代 Python 项目使用本地图书馆执行计算功能, 并给 Python 界面提供提高执行速度的计算功能; 因此, 测试这些图书馆对项目的稳健性至关重要 。 一个挑战是, 现有方法使用覆盖来引导生成, 但本地图书馆作为黑盒运行到 Python 代码, 没有执行信息 。 另一个是动态二进制仪减少测试性能, 因为它需要同时监测本地图书馆和 Python 虚拟机器 。 为了应对这些挑战, 我们在本文件中提出一个在 Python 代码层运行的自动测试案例生成方法 。 我们的洞察力是, 本地图书馆的许多路径条件都是通过与 VM 互动处理输入数据结构的。 我们的方法是, 我们用 Python Interprepret 来监测本地图书馆和 Vython 代码的代码的代码。 我们用一个名为 PyC 的工具来实施我们的测试方法, 并将其应用到六个广泛使用的 Python 项目中。 实验结果显示, PyC 能够覆盖更多的执行路径路径路径, 在现有的测试案例和状态测试工具中, 测试工具中, 也用一个可接受的 Ptreal- check- checkmental- constration viculation vical