Python 可以对使用子流程的代码运行单元测试吗?

Python 可以对使用子流程的代码运行单元测试吗?,python,django,unit-testing,Python,Django,Unit Testing,我的Django应用程序有一些管理命令,这些命令使用subprocess.Popen(['manage.py',''…)启动其他管理命令。它们保持这种状态主要是为了并行运行进程,防止一个命令干扰另一个命令 但是,在编写单元测试时,这些新进程不使用测试环境和数据库,因此会失败 现在,我添加了一个运行call_command()而不是Popen()的设置(请参见下文): if settings.TESTING: self.returncode=call_命令(self.command,*params

我的Django应用程序有一些管理命令,这些命令使用
subprocess.Popen(['manage.py',''…)
启动其他管理命令。它们保持这种状态主要是为了并行运行进程,防止一个命令干扰另一个命令

但是,在编写单元测试时,这些新进程不使用测试环境和数据库,因此会失败

现在,我添加了一个运行
call_command()
而不是
Popen()
的设置(请参见下文):

if settings.TESTING:
self.returncode=call_命令(self.command,*params)
其他:
self.process=subprocess.Popen(['python','manage.py',self.command]+params)
#……稍后:
self.process.wait()
self.returncode=self.process.returncode
但是,子流程调用和等待中涉及的逻辑仍然未测试。是否可以在单元测试中测试子流程调用


注意:测试数据库不是内存中的SQLite-我知道这不起作用。它是一个实际的数据库,每次运行时都会创建和销毁。

如果将其视为单元测试,则可以模拟命令调用以返回模拟数据,以确保命令调用方正常工作

对于命令代码的覆盖范围,您还可以使用Django提供的
call_command
方法,仅为该命令编写另一个单元测试

像这样:

类TestYourCommandCaller(TestCase):
...
@mock.patch('subprocess.Popen')
def test_your_business_调用_命令(self,mock_进程):
#模仿你的过程
调用您的函数,该函数创建进程()
#断言您的进程已被调用
以及对您的命令进行的另一项测试,以覆盖命令代码:

类TestYourCommand(TestCase):
def测试命令调用(自):
调用命令('command_name',*params)
#断言结果

如果将其视为单元测试,则可以模拟命令调用以返回模拟数据,以确保命令调用方工作正常

对于命令代码的覆盖范围,您还可以使用Django提供的
call_command
方法,仅为该命令编写另一个单元测试

像这样:

类TestYourCommandCaller(TestCase):
...
@mock.patch('subprocess.Popen')
def test_your_business_调用_命令(self,mock_进程):
#模仿你的过程
调用您的函数,该函数创建进程()
#断言您的进程已被调用
以及对您的命令进行的另一项测试,以覆盖命令代码:

类TestYourCommand(TestCase):
def测试命令调用(自):
调用命令('command_name',*params)
#断言结果

这听起来像是代码访问的数据库应该由env变量控制。当您开始测试并启动测试数据库时,您还可以设置env变量。如果您将其视为单元测试,请模拟您的命令调用以返回数据或任何您需要的内容,以确保命令调用程序工作正常-1个单元。然后编写一个命令调用程序她的test-to-test命令-另一个单元。@Toankocho这实际上很有意义。如果你把它变成一个答案,我会接受它。这听起来像是代码命中的数据库应该由env变量控制。当你开始测试并启动测试数据库时,你也可以设置env变量。如果你认为它是一个单元测试,模拟您的命令调用以返回数据或任何您需要的东西,以确保命令调用方正常工作-1个单位。然后编写另一个测试以仅测试命令-另一个单位。@Toankocho这实际上很有意义。如果您将此转化为答案,我将接受它。