mock在Python3.3之前是第三方的库,在Pyhton3.3版本之后是标准库,只需要导入就可以使用了.
Pyhton3.3版本之前引入方式是:
import mock
Pyhton3.3版本之后引入方式是:现在已经被整合到unittest的标准库⾥⾯
from unittest import mock

Mock的意义:Mocks能够让我们模拟那些在单元测试中不可用或太笨重的资源
Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python对象,
以达到模拟对象的行为。Mock它可以替换Python对象。

现实情况:
1、环境由于客观原因导致无法搭建
2、搭建的服务器需要的值需要大量的工作才可以

案例一、使⽤mock模拟类⾥⾯的⽅法
 1 from unittest import mock
 2 class MockObj:
 3     def info(self):
 4         return 'Hello Mock'
 5 
 6 '''使⽤mock模拟类⾥⾯的⽅法'''
 7 obj=mock.Mock()
 8 obj.info.return_value='Hello Mock'
 9 
10 '''测试是否模拟成功'''
11 if MockObj().info()==obj.info():
12     print('模拟成功')
13 else:
14     print('请检查,mock模拟类的⽅法模拟失败')
案例二、模拟访问网站的方法是否正确(网站无搭建环境,使用mock模拟)
1 import requests
2 
3 def send_url(url):
4     r=requests.get(url)
5     return r.status_code
6 
7 def visit_url():
8     return send_url('http://www.ccccoooo.com')
url_dec.py
 1 import unittest
 2 from unittest import mock
 3 from mock_test import url_dec
 4 
 5 class url_Test(unittest.TestCase):
 6 
 7     def test_success_url(self):
 8         success_url=mock.Mock(return_value='200')
 9         url_dec.send_url=success_url
10         self.assertEqual(url_dec.visit_url(),'200')
11 
12     def test_fail_url(self):
13         fail_url=mock.Mock(return_value='404')
14         url_dec.send_url=fail_url
15         self.assertEqual(url_dec.visit_url(),'404')
16 
17 if __name__ == '__main__':
18     unittest.main(verbosity=2)
url_test.py
案例三、模拟一个函数(删除C盘下Windows的⽂件夹),测试此函数的准确性(只能使用模拟手段),
模拟不要运行删除C盘!
 1 import os
 2 import unittest
 3 from unittest import mock
 4 
 5 class OsRemove:
 6     def delWindows(self,path='c:/Windows'):
 7         obj=os.rmdir(path)
 8         if obj==None:
 9             return 'success'
10         else:
11             return 'fail'
12 
13     def existsWindows(self):
14         return self.delWindows()
15 
16 
17 '''测试代码'''
18 class TestWin(unittest.TestCase):
19     def setUp(self) -> None:
20         self.r=OsRemove()
21 
22     def test_delWindows_success(self):
23         '''删除⽬录成功'''
24         success_obj=mock.Mock(return_value='success')
25         self.r.delWindows=success_obj
26         self.assertEqual(self.r.existsWindows(),success_obj())
27 
28     def test_delWindows_fail(self):
29         '''删除⽬录失败'''
30         fail_obj=mock.Mock(return_value='fail')
31         self.r.delWindows=fail_obj
32         self.assertEqual(self.r.existsWindows(),fail_obj())
33 
34 if __name__ == '__main__':
35     unittest.main(verbosity=2)
mock_delWindows_test.py
mock中使用patch或者patch.object的目的是为了控制mock的范围,模拟的类或者模拟的函数,
使用with语句范围内mock一个对象。
 1 #!/usr/bin/env python
 2 #!coding:utf-8
 3 
 4 from unittest import mock
 5 import requests
 6 import unittest
 7 from types import SimpleNamespace
 8 
 9 def send_request(url):
10     r=requests.get(url)
11     return r.status_code
12 
13 '''使⽤mock替换request.get(),直接返回⼀个固定的值'''
14 class WebTest(unittest.TestCase):
15     def setUp(self) -> None:
16         self.obj=requests.get
17 
18     def test_success_200(self):
19         datas=SimpleNamespace(url='http://www.ccccoooo.com',code=200)
20         with mock.patch('requests.get') as get:
21             get.return_value.status_code=datas.code
22             self.assertEqual(send_request(datas.url),datas.code)
23 
24     def test_success_404(self):
25         datas=SimpleNamespace(url='http://www.ccccoooo.com',code=404)
26         with mock.patch('requests.get') as get:
27             get.return_value.status_code=datas.code
28             self.assertEqual(send_request(datas.url),datas.code)
29 
30 if __name__ == '__main__':
31     unittest.main(verbosity=2)
案例二修改优化
 1 #!/usr/bin/env python
 2 #!coding:utf-8
 3 
 4 import os
 5 import unittest
 6 from unittest import mock
 7 from types import SimpleNamespace
 8 
 9 class OsRemove:
10     def delWindows(self,path='c:/Windows'):
11         return os.rmdir(path)
12 
13 '''测试代码'''
14 class TestWin(unittest.TestCase):
15     def setUp(self) -> None:
16         self.r=OsRemove()
17 
18     def test_delWindows_success_patch(self):
19         datas=SimpleNamespace(status='success')
20         with mock.patch('os.rmdir') as get:
21             get.return_value=datas.status
22             self.assertEqual(self.r.delWindows(),datas.status)
23 
24     def test_delWindows_fail_patch(self):
25         datas=SimpleNamespace(status='fail')
26         with mock.patch('os.rmdir') as get:
27             get.return_value=datas.status
28             self.assertEqual(self.r.delWindows(),datas.status)
29 
30 if __name__ == '__main__':
31     unittest.main(verbosity=2)
案例三修改优化


2022-11-5笔记
posted on 2022-11-06 00:13  三天乐趣  阅读(283)  评论(0编辑  收藏  举报