Python: 如何测试使用fork的程序?

Python: How to tests a program that uses fork?

我正在编写一个程序,在生产环境中使用相同代码的多个实例。然后实例通过网络进行通信,但这与此处无关。

在开发过程中,我多次fork初始进程以获得完整的实例设置,这非常方便。

然而,尝试对此编写集成测试给我带来了问题:测试框架(unittest/nosetests/py.test)当然也是分叉的,所以我最终得到了多个副本测试框架,提供了乱码结果作为每个 child 单元测试重叠的输出。

一个简化的例子:

为此,我需要 "unload" 或从 child 进程中停止测试框架。我该怎么做?

我可以通过仅在分叉 children 之后调用测试套件来解决此问题,但我需要 re-start 所有 children 进行每个测试。

在这种情况下分叉进程很麻烦,因为子进程会继承父进程的完整堆栈,包括测试框架的 运行 实例。

基本上有两种选择可以解决这个问题:

第一是在初始化测试框架之前进行分叉,然后从测试中访问子进程。如果子进程是长期存在的,这很有效,但如果每个测试都要启动子进程,甚至可能使用不同的测试,这被证明是一个麻烦 fixtures/scenarios.

第二个是通过使用 subprocess / Popen 简单地启动进程来放弃所有的分叉。我找到了一个名为 xprocess 的 pytest 插件,它可以帮助您完成这项任务。它没有提供我所需要的,但它为我指明了正确的方向。