如何使用python unittest对函数中的两个函数返回值进行单元测试

如何使用python unittest对函数中的两个函数返回值进行单元测试,python,python-unittest,Python,Python Unittest,我在python程序中有一个函数,它执行两次函数调用: def add_用户(uname、dserver、pwd、dinstance、proc1、query1): db_conn=db_connect(uname、dserver、pwd、dinstance) 如果db_conn不是_conn: 打印(“连接失败”) 系统出口(-1) 数据库连接运行程序(程序1) 如果数据库连接错误消息: 打印(“失败的程序”) 系统出口(-1) 数据库连接运行查询(查询1) 如果db_conn.err_msg:

我在python程序中有一个函数,它执行两次函数调用:

def add_用户(uname、dserver、pwd、dinstance、proc1、query1):
db_conn=db_connect(uname、dserver、pwd、dinstance)
如果db_conn不是_conn:
打印(“连接失败”)
系统出口(-1)
数据库连接运行程序(程序1)
如果数据库连接错误消息:
打印(“失败的程序”)
系统出口(-1)
数据库连接运行查询(查询1)
如果db_conn.err_msg:
打印(“查询失败”)
系统出口(-1)
现在单元测试如下:

@patch('mydir.proj\u dir.db\u execu.db\u connect')
def测试添加用户(自身、模拟连接):
mock_conn.return_value.not_conn.return_value=True
模拟连接返回值运行过程返回值=真
mock\u conn.return\u value.run\u query.return\u value=True
mock\u conn.return\u value.err\u msg.side\u effect=[True,False]
使用self.assertRaises(SystemExit):
添加用户(名称、数据服务器、pwd、数据状态、过程1、查询1)
打印(“查询失败”)


我的目标是测试第二个错误条件。但在添加副作用后,它只进入第一个条件,显示为“失败的过程”。我想测试“查询失败”条件。我已经测试了前两个错误条件,但第三个错误条件失败,并且总是调用第二个条件。请告诉我。

你到底在问什么还不是很清楚。您只调用了一次
add\u user
,因此您只测试一个“路径”,您需要多次调用它来测试通过它的多个“路径”

除此之外,您对
mock
返回值
副作用
的理解有一个很大的问题,将mock配置为可调用的,当访问属性但不调用它们时,您只是得到链中的下一个mock,您没有使用任何配置。mock还支持配置数据模型的一些“神奇方法”,但不支持配置mock内部使用的
\uuu getattr\uuu
(“简单”属性访问)

因此,您应该只使用mock来修补/替换
db_connect
来返回伪连接,而不是使用mock,因为伪连接应该是假的:您自己构建的对象,看起来像一个连接,但行为却与您想要的一样,例如

类伪连接:
定义初始化(self,fail\u proc=False,fail\u query=False):
self.\u fail\u proc=fail\u proc
self.\u fail\u query=fail\u query
self.err_msg=None#或error_msg,或两者都有
def运行程序(自身,程序):
self.err\u msg=self.\u fail\u proc
def运行查询(自我,查询):
self.err\u msg=self.\u失败\u查询
然后您只需配置
mock\u conn.return\u value=PseudoConnection(True,False)
来测试第一种情况,而
mock\u conn.return\u value=PseudoConnection(False,True)
来测试第二种情况

此外,正如注释所暗示的,您正在访问
error\u msg
err\u msg
,并且仅尝试配置
err\u msg
。我不知道哪一个是正确的,但我怀疑这两个都是正确的。

print(“失败的查询”)没有在覆盖范围内执行。请注意,我使用logger.info代替打印,但例如,我添加了打印