在第三方应用程序的自定义解释器中运行所有pytest测试

时间:2016-08-24 13:41:01

标签: python pytest

TL; DR:如何获得pytest插件将正在运行的测试重定向到生成的进程(在不同的环境/ python解释器中)?

我正在开发一个python脚本,它由嵌入在第三方应用程序中的python解释器运行(即IDA)。我现在正在使用pytest使用我为应用程序编写的pytest插件为我的脚本创建测试。因为应用程序只在它自己的解释器中提供某些模块,所以任何测试都必须在应用程序内部的python解释器中运行。

我希望通过允许它在第三方应用程序内执行pytest会话来改进我的pytest插件,而不是在一个普通的解释器中。

我知道如何使我的测试和pytest在应用程序内运行,这将类似于:

subprocess.call("C:\Program Files\IDA\idaq.exe" -S <My script>", shell=True)

我在哪里挣扎(我假设pytest钩子,但是哪一个?)我应该在里面产生pytest会话?如何确保将测试参数传递给新进程?

我认为这可以作为pytest插件使用,因为它有点类似于xdist插件。

1 个答案:

答案 0 :(得分:1)

除非有人走近并表现出兴趣,否则我不会太深入地回答这个问题,因为那会很长

我设法通过类似于pytest-xdist的分布式执行方式来做到这一点,而不是使用subprocess.Popen来生成,而不是使用execnet来远程执行python解释器。第三方应用程序的实例(指向要执行的python脚本)。我正在使用multiprocessing.Listener and multiprocessing.Client创建一个可以对python对象进行序列化的通信通道。

然后,我像xdist一样,创建了一个附加的pytest插件,该插件由应用程序加载的脚本register进行了封装。那个pytest插件使用pytest's available hooking facilities注册了少数钩子,然后将其传递回原始pytest实例,这将再次触发它们,以模拟它们被pytest本身触发。

对于任何对我相信比pytest-xdist更易于理解的示例感兴趣的人,相关代码可以在我的github repo上找到。