加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 安全 > 正文

Mock在Python单元测试中的使用

发布时间:2021-01-10 23:43:45 所属栏目:安全 来源:网络整理
导读:《Mock在Python单元测试中的使用》要点: 本文介绍了Mock在Python单元测试中的使用,希望对您有用。如果有疑问,可以联系我们。 本文讲述的是 Python 中 Mock 的使用. 如何执行单元测试而不用考验你的耐心 很多时候,我们编写的软件会直接与那些被标记为“垃

之前定义的 rm 方法相当的简单.在盲目地删除之前,我们倾向于验证一个路径是否存在,并验证其是否是一个文件.让我们重构 rm 使其变得更加智能:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import os.path
  5. def rm(filename):
  6. ? ?if os.path.isfile(filename):
  7. ? ? ? ?os.remove(filename)

很好.现在,让我们调整测试用例来保持测试的覆盖率.

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from mymodule import rm
  4. import mock
  5. import unittest
  6. class RmTestCase(unittest.TestCase):
  7. ? ?@mock.patch('mymodule.os.path')
  8. ? ?@mock.patch('mymodule.os')
  9. ? ?def test_rm(self, mock_os, mock_path):
  10. ? ? ? ?# set up the mock
  11. ? ? ? ?mock_path.isfile.return_value = False
  12. ? ? ? ?rm("any path")
  13. ? ? ? ?# test that the remove call was NOT called.
  14. ? ? ? ?self.assertFalse(mock_os.remove.called, "Failed to not remove the file if not present.")
  15. ? ? ? ?# make the file 'exist'
  16. ? ? ? ?mock_path.isfile.return_value = True
  17. ? ? ? ?rm("any path")
  18. ? ? ? ?mock_os.remove.assert_called_with("any path")

我们的测试用例完全改变了.现在我们可以在没有任何副作用的情况下核实并验证方法的内部功能.

将文件删除作为服务

到目前为止,我们只是将 mock 应用在函数上,并没应用在需要传递参数的对象和实例的方法上.我们现在开始涵盖对象的方法.

首先,我们将?rm?方法重构成一个服务类.实际上将这样一个简单的函数转换成一个对象,在本质上这不是一个合理的需求,但它能够帮助我们了解?mock?的关键概念.让我们开始重构:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import os.path
  5. class RemovalService(object):
  6. ? ?"""A service for removing objects from the filesystem."""
  7. ? ?def rm(filename):
  8. ? ? ? ?if os.path.isfile(filename):
  9. ? ? ? ? ? ?os.remove(filename)

你会注意到我们的测试用例没有太大变化:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from mymodule import RemovalService
  4. import mock
  5. import unittest
  6. class RemovalServiceTestCase(unittest.TestCase):
  7. ? ?@mock.patch('mymodule.os.path')
  8. ? ?@mock.patch('mymodule.os')
  9. ? ?def test_rm(self, mock_path):
  10. ? ? ? ?# instantiate our service
  11. ? ? ? ?reference = RemovalService()
  12. ? ? ? ?# set up the mock
  13. ? ? ? ?mock_path.isfile.return_value = False
  14. ? ? ? ?reference.rm("any path")
  15. ? ? ? ?# test that the remove call was NOT called.
  16. ? ? ? ?self.assertFalse(mock_os.remove.called, "Failed to not remove the file if not present.")
  17. ? ? ? ?# make the file 'exist'
  18. ? ? ? ?mock_path.isfile.return_value = True
  19. ? ? ? ?reference.rm("any path")
  20. ? ? ? ?mock_os.remove.assert_called_with("any path")

很好,我们知道?RemovalService?会如预期般的工作.接下来让我们创建另一个服务,将?RemovalService?声明为它的一个依赖:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import os.path
  5. class RemovalService(object):
  6. ? ?"""A service for removing objects from the filesystem."""
  7. ? ?def rm(self, filename):
  8. ? ? ? ?if os.path.isfile(filename):
  9. ? ? ? ? ? ?os.remove(filename)
  10. class UploadService(object):
  11. ? ?def __init__(self, removal_service):
  12. ? ? ? ?self.removal_service = removal_service
  13. ? ?def upload_complete(self, filename):
  14. ? ? ? ?self.removal_service.rm(filename)

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!