Python: 如何测试使用fork的程序?
Python: How to tests a program that uses fork?
我正在编写一个程序,在生产环境中使用相同代码的多个实例。然后实例通过网络进行通信,但这与此处无关。
在开发过程中,我多次fork初始进程以获得完整的实例设置,这非常方便。
然而,尝试对此编写集成测试给我带来了问题:测试框架(unittest/nosetests/py.test)当然也是分叉的,所以我最终得到了多个副本测试框架,提供了乱码结果作为每个 child 单元测试重叠的输出。
一个简化的例子:
- 程序是聊天客户端,通过某种网络连接(例如,redis pubsub)连接到另一个客户端
- 程序将 API 公开给 post 并读取消息
- 我想分叉出两个相互连接的程序实例
- 测试应该使用 API 来确保客户端通过 sending/receiving 消息 to/from 相互工作
- 主进程监督 child 进程的错误并运行测试套件
为此,我需要 "unload" 或从 child 进程中停止测试框架。我该怎么做?
我可以通过仅在分叉 children 之后调用测试套件来解决此问题,但我需要 re-start 所有 children 进行每个测试。
在这种情况下分叉进程很麻烦,因为子进程会继承父进程的完整堆栈,包括测试框架的 运行 实例。
基本上有两种选择可以解决这个问题:
第一是在初始化测试框架之前进行分叉,然后从测试中访问子进程。如果子进程是长期存在的,这很有效,但如果每个测试都要启动子进程,甚至可能使用不同的测试,这被证明是一个麻烦 fixtures/scenarios.
第二个是通过使用 subprocess
/ Popen
简单地启动进程来放弃所有的分叉。我找到了一个名为 xprocess 的 pytest 插件,它可以帮助您完成这项任务。它没有提供我所需要的,但它为我指明了正确的方向。
我正在编写一个程序,在生产环境中使用相同代码的多个实例。然后实例通过网络进行通信,但这与此处无关。
在开发过程中,我多次fork初始进程以获得完整的实例设置,这非常方便。
然而,尝试对此编写集成测试给我带来了问题:测试框架(unittest/nosetests/py.test)当然也是分叉的,所以我最终得到了多个副本测试框架,提供了乱码结果作为每个 child 单元测试重叠的输出。
一个简化的例子:
- 程序是聊天客户端,通过某种网络连接(例如,redis pubsub)连接到另一个客户端
- 程序将 API 公开给 post 并读取消息
- 我想分叉出两个相互连接的程序实例
- 测试应该使用 API 来确保客户端通过 sending/receiving 消息 to/from 相互工作
- 主进程监督 child 进程的错误并运行测试套件
为此,我需要 "unload" 或从 child 进程中停止测试框架。我该怎么做?
我可以通过仅在分叉 children 之后调用测试套件来解决此问题,但我需要 re-start 所有 children 进行每个测试。
在这种情况下分叉进程很麻烦,因为子进程会继承父进程的完整堆栈,包括测试框架的 运行 实例。
基本上有两种选择可以解决这个问题:
第一是在初始化测试框架之前进行分叉,然后从测试中访问子进程。如果子进程是长期存在的,这很有效,但如果每个测试都要启动子进程,甚至可能使用不同的测试,这被证明是一个麻烦 fixtures/scenarios.
第二个是通过使用 subprocess
/ Popen
简单地启动进程来放弃所有的分叉。我找到了一个名为 xprocess 的 pytest 插件,它可以帮助您完成这项任务。它没有提供我所需要的,但它为我指明了正确的方向。