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

时间:2017-07-07 15:23:11

标签: python testing pytest python-unittest nose

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

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

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

简化示例:

  • 程序是聊天客户端,通过某种网络连接(例如,redis pubsub)连接到另一个客户端
  • 程序公开API以发布和阅读消息
  • 我想分出两个相互连接的程序实例
  • 测试应该使用API​​来确保客户端通过向/从彼此发送/接收消息来工作
  • 主进程监督子进程的错误并运行测试套件

要实现这一目标,我需要"卸载"或者从子进程中停止测试框架。我怎么能这样做?

我可以通过在分离孩子之后调用测试套件来解决这个问题,但我需要为每次测试重新启动所有孩子。

1 个答案:

答案 0 :(得分:0)

在此上下文中分叉进程是一个很大的麻烦,因为子进程继承了父进程的完整堆栈,包括测试框架的运行实例。

基本上有两种方法可以解决这个问题:

第一个是在初始化测试框架之前进行分叉,然后从测试中访问子进程。如果子进程是长期存在的,那么这种方法很有效,但如果要在每次测试中启动子进程,甚至可能使用不同的测试装置/场景,这会很麻烦。

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