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)案例三修改优化
标签:url,self,def,使用,import,unittest,mock,python3.9 From: https://www.cnblogs.com/yuntimer/p/16860693.html
2022-11-5笔记