首页 > 编程语言 >mock的使用(python3.9)

mock的使用(python3.9)

时间:2022-11-06 00:22:48浏览次数:47  
标签:url self def 使用 import unittest mock python3.9

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笔记

标签:url,self,def,使用,import,unittest,mock,python3.9
From: https://www.cnblogs.com/yuntimer/p/16860693.html

相关文章

  • 使用applescript 触发键盘快捷键
    https://stackoverflow.com/questions/3690167/how-can-one-invoke-a-keyboard-shortcut-from-within-an-applescript如果想触发tab的话,就把引号去掉,比如这样来触发comma......
  • 什么是 immutable?为什么要使用它?
    什么是immutable?为什么要使用它?​​immutable​​是一种持久化数据。一旦被创建就不会被修改对​​Immutable​​对象的任何修改或添加删除操作都会返回一个新的​​Immu......
  • nanopb安装和使用入门
    简介Nanopbisaplain-CimplementationofGoogle's ProtocolBuffers dataformat.Itistargetedat32bitmicrocontrollers,butisalsofitforotherem......
  • 使用 Java 类生成 MD5 加密字符
    MD5常用于密码加密,例如,在注册时可以将密码转为MD5再放入数据库,在登录时校验登录密码和数据库存放的加密密码是否一致,来保证密码在数据库中存储的安全性。下面介绍使用......
  • ROS2进阶:colcon的初步使用--‘colcon‘ is not recognized
    系统安装路径:C:\opt\ros\galactic系统安装参考:​​ROS2在windows上的安装​​。如果你是按ROS官网的办法安装的,路径可能会有所不同,比如按​​InstallingROS2onWindows......
  • 开始使用AspectJ-@AfterThrowing ,@After ,@Pointcut 定义切入点(比较重要)
    开始使用AspectJ(接下来的作为了解就行)1.[了解]@AfterThrowing异常通知-注解中有throwing属性在目标方法抛出异常后执行。该注解的throwing属性用于指定所发生的异......
  • 使用AspectJ-@AfterReturning(returning ret),@Around (ProceedingJoinPoint pjp)环绕
    开始使用AspectJ1.[掌握]@AfterReturning后置通知-注解有returning属性在目标方法执行之后执行。由于是目标方法之后执行,所以可以获取到目标方法的返回值。该注解......
  • Lombok安装及Lombok使用
    lombok简介lombok使用lombok详解lombok插件lombok安装简介通常在写java代码,避免不了要写一堆setter、getter、toString等方法,代码没什么技巧还非常占篇幅,当修改了......
  • Git在实际生产中的使用
    最常用代码合作流程建议首先看一下这个,如醍醐灌顶:https://www.bilibili.com/video/BV19e4y1q7JJ/三个东西:Remote:远端仓库;Local:本地Git仓库(可以理解为一个Git记录表,......
  • 在 .NET 7上使用 WASM 和 WASI
    WebAssembly(WASM)和WebAssemblySystemInterface(WASI)为开发人员开辟了新的世界。.NET开发人员在BlazorWebAssembly发布时熟悉了WASM。BlazorWebAssembly在浏览器中......