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

Python:如何测试使用fork的程序?,python,testing,pytest,python-unittest,nose,Python,Testing,Pytest,Python Unittest,Nose,我正在编写一个程序,在生产中使用同一代码的多个实例。然后实例通过网络进行通信,但这与此无关 在开发过程中,我多次分叉初始过程以获得完整的实例设置,这非常方便 然而,试图在此基础上编写集成测试给了我一些问题:测试框架(unittest/nosetests/py.test)当然也是分叉的,因此我最终得到了多个测试框架副本,作为每个子级的unittest重叠的输出提供了混乱的结果 一个简化的例子: 该程序是聊天客户端,通过某种网络连接(例如,redis pubsub)连接到另一个客户端 程序公开一个

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

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

然而,试图在此基础上编写集成测试给了我一些问题:测试框架(unittest/nosetests/py.test)当然也是分叉的,因此我最终得到了多个测试框架副本,作为每个子级的unittest重叠的输出提供了混乱的结果

一个简化的例子:

  • 该程序是聊天客户端,通过某种网络连接(例如,redis pubsub)连接到另一个客户端
  • 程序公开一个API来发布和读取消息
  • 我想分出两个相互连接的程序实例
  • 测试应该使用API来确保客户端通过相互发送/接收消息来工作
  • 主进程监督子进程的错误并运行测试套件
为了实现这一点,我需要从子进程“卸载”或停止测试框架。我该怎么做


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

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

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

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


第二种方法是通过使用
子流程
/
Popen
来简单地启动流程,从而放弃所有的分叉。我发现了一个名为pytest的插件,它可以帮助您完成这项任务。它没有提供我所需要的东西,但它为我指明了正确的方向。

你能详细介绍一下乱码的结果,并给出你试图测试的代码和期望的结果的大致想法吗。完成-希望这更容易理解。我想你的问题在于输出,因为stdout不是线程安全的。您可以尝试为每个进程重定向stdout,或者重构代码以注入输出载体。我不这么认为。Fork复制整个过程。所以分叉两次后,我得到了同一进程的三个实例,都在运行unittest。因此,所有测试基本上执行三次,并产生三次输出。