python - 如何使用python unitttest对函数中的两个函数返回值进行单元测试
问题描述
我在 python 程序中有一个函数,它执行两次函数调用:
def add_user(uname,dserver,pwd,dinstance,proc1, query1):
db_conn = db_connect(uname,dserver,pwd,dinstance)
if db_conn is not_conn:
print("Failed to connect")
sys.exit(-1)
db_conn.run_proc(proc1)
if db_conn.error_msg:
print("Failed procedure")
sys.exit(-1)
db_conn.run_query(query1)
if db_conn.err_msg:
print("Failed query")
sys.exit(-1)
现在单元测试如下:
@patch('mydir.proj_dir.db_execu.db_connect')
def test_add_user(self, mock_conn):
mock_conn.return_value.not_conn.return_value = True
mock_conn.return_value.run_proc.return_value = True
mock_conn.return_value.run_query.return_value = True
mock_conn.return_value.err_msg.side_effect= [True, False]
with self.assertRaises(SystemExit):
add_user(name,dserver,pwd,dinstance,proc1, query1)
print("failed query")
我的目标是测试第二个错误条件。但是在添加 side_effect 之后,它只会进入显示为“失败过程”的第一个条件。我想测试“查询失败”的情况。我已经测试过前两个错误条件,但第三个错误条件失败并始终调用第二个条件。请指教。
解决方案
目前还不清楚你到底在问什么。你add_user
只调用一次,所以你只测试一个“路径”,你需要多次调用它来测试通过它的多个“路径”。
mock
return_value
除此之外,您对模拟并将其side_effect
配置为可调用对象的理解存在很大问题,当访问属性但不调用它们时,您只是获得了链中的下一个模拟,您没有使用任何配置。mock 还支持配置数据模型的一些“魔术方法”,但它不支持配置__getattr__
(“简单”属性访问),因为它在 mock 内部使用。
因此,您应该只使用模拟来修补/替换db_connect
以返回伪连接,而不是模拟认为伪连接应该是假的:您自己构建的对象,它看起来像一个连接,但行为却是您想要的例如
class PseudoConnection:
def __init__(self, fail_proc=False, fail_query=False):
self._fail_proc = fail_proc
self._fail_query = fail_query
self.err_msg = None # or error_msg, or both
def run_proc(self, proc):
self.err_msg = self._fail_proc
def run_query(self, query):
self.err_msg = self._fail_query
然后,您只需配置mock_conn.return_value = PseudoConnection(True, False)
测试第一种情况和mock_conn.return_value = PseudoConnection(False, True)
第二种情况。
正如评论所暗示的那样,您同时访问error_msg
and err_msg
,并且仅尝试配置err_msg
. 我不知道哪个是正确的,但我怀疑两者都是。
推荐阅读
- python - pytest-django 无法工作,因为 PytestDeprecationWarning: `funcargnames` 属性是`fixturenames` 的别名,
- c - 在c语言中将浮点负值转换为整数值
- php - 如何在magento基础项目中跟踪导致内存泄漏的原因?
- arrays - 将多个字符串作为单个字符串添加到列表中
- azure - 如何在 Azure b2c 身份验证中获取所有用户范围?
- c - 使用内联 asm 将中断 11 引发到内核模块时出错
- ffmpeg - 如何有效压缩 gif 以减小大小?
- vue.js - Vue.js中POST 404(Not Found)的常见可能原因除了用错字定义地址外还有哪些
- wireshark - 如何从 youtube 数据包中知道完整的链接地址
- laravel - Laravel - 在 laravel 中运行测试时出现错误