python单元测试--mock使用mock,可以将某个函数所依赖的对象或者变量mock掉,从而降低测试条件的负责度 。如下所示:
上述是mock对象的简单使用方法,通过实例化一个Mock对象从而模拟掉原始函数的返回值 , 高级一些的用法就是通过mock.patch装饰器,装饰在类或者函数上进行模拟测试 , 如下在test.py文件中有两个类:
测试用例设计如下:
以上测试用例说明,通过patch装饰器模拟了 test.ProductionClass1 这个类,在 test_01 中使用 mock_class 模拟 test.ProductionClass1。首先通过 mock_class.return_value 获取类实例(如果模拟的是函数,则不需要这一步),然后通过 obj1.pro1_method.return_value 设置方法的返回值,并进行测试 。测试结果说明无论是通过 mock_class 还是 test.ProductionClass1 还是 obj1 执行方法,获取到的结果都是设置的值,并且在另一个类中调用模拟类的方法,也能成功获取到设置的 return_value。
python如何开展单元测试?首先你要知道单元测试是什么,单元测试就是针对软件中的最小可测试单元进行检查和验证,在python中可以理解为是对类或者是方法的正确性验证
其次要了解python语言中的单元测试框架有哪些,在python语言中的单元测试框架也有很多,解释本身自带的unittest单元测试框架,还有很流行的pytest(有丰富的插件),这些在我之前在黑马程序员学习测试时都有涉及,或者你可以去看论坛上面有很多python开展单元测试的技术文章 。
最后使用某个单元测试框架如何实现,拿解释器自带的unittest举例子吧,使用这个框架来实现单元测试的话,需要创建测试类,创建测试方法,设置fixture,断言,然后通过测试条件和运行器来执行测试用例.其测试数据可以使用参数化动态获取.
用python单元测试怎么测一段代码单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作 。
比如对函数abs(),我们可以编写出以下几个测试用例:
输入正数,比如1、1.2、0.99,期待返回值与输入相同;
输入负数,比如-1、-1.2、-0.99,期待返回值与输入相反;
输入0 , 期待返回0;
输入非数值类型 , 比如None、[]、{},期待抛出TypeError 。
把上面的测试用例放到一个测试模块里,就是一个完整的单元测试 。
如果单元测试通过,说明我们测试的这个函数能够正常工作 。如果单元测试不通过,要么函数有bug , 要么测试条件输入不正确,总之,需要修复使单元测试能够通过 。
单元测试通过后有什么意义呢?如果我们对abs()函数代码做了修改,只需要再跑一遍单元测试 , 如果通过,说明我们的修改不会对abs()函数原有的行为造成影响,如果测试不通过,说明我们的修改与原有行为不一致,要么修改代码,要么修改测试 。
这种以测试为驱动的开发模式最大的好处就是确保一个程序模块的行为符合我们设计的测试用例 。在将来修改的时候,可以极大程度地保证该模块行为仍然是正确的 。
我们来编写一个Dict类 , 这个类的行为和dict一致,但是可以通过属性来访问,用起来就像下面这样:
d = Dict(a=1, b=2)
d['a']
1
d.a
1
mydict.py代码如下:
class Dict(dict):
def __init__(self, **kw):
super(Dict, self).__init__(**kw)
def __getattr__(self, key):
try:
return self[key]
except KeyError:
raise AttributeError(r"'Dict' object has no attribute '%s'" % key)
def __setattr__(self, key, value):
self[key] = value
【包含python函数单元测试的词条】为了编写单元测试,我们需要引入Python自带的unittest模块,编写mydict_test.py如下:
import unittest
from mydict import Dict
class TestDict(unittest.TestCase):
def test_init(self):
d = Dict(a=1, b='test')
self.assertEquals(d.a, 1)
self.assertEquals(d.b, 'test')
self.assertTrue(isinstance(d, dict))
def test_key(self):
d = Dict()
d['key'] = 'value'
self.assertEquals(d.key, 'value')
def test_attr(self):
d = Dict()
d.key = 'value'
self.assertTrue('key' in d)
self.assertEquals(d['key'], 'value')
def test_keyerror(self):
d = Dict()
with self.assertRaises(KeyError):
value = https://www.04ip.com/post/d['empty']
def test_attrerror(self):
d = Dict()
with self.assertRaises(AttributeError):
value = https://www.04ip.com/post/d.empty
编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承 。
以test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行 。
对每一类测试都需要编写一个test_xxx()方法 。由于unittest.TestCase提供了很多内置的条件判断 , 我们只需要调用这些方法就可以断言输出是否是我们所期望的 。最常用的断言就是assertEquals():
self.assertEquals(abs(-1), 1) # 断言函数返回的结果与1相等
另一种重要的断言就是期待抛出指定类型的Error,比如通过d['empty']访问不存在的key时,断言会抛出KeyError:
with self.assertRaises(KeyError):
value = https://www.04ip.com/post/d['empty']
而通过d.empty访问不存在的key时,我们期待抛出AttributeError:
with self.assertRaises(AttributeError):
value = https://www.04ip.com/post/d.empty
运行单元测试
一旦编写好单元测试,我们就可以运行单元测试 。最简单的运行方式是在mydict_test.py的最后加上两行代码:
if __name__ == '__main__':
unittest.main()
这样就可以把mydict_test.py当做正常的python脚本运行:
$ python mydict_test.py
另一种更常见的方法是在命令行通过参数-m unittest直接运行单元测试:
$ python -m unittest mydict_test
.....
----------------------------------------------------------------------
Ran 5 tests in 0.000s
OK
这是推荐的做法,因为这样可以一次批量运行很多单元测试,并且,有很多工具可以自动来运行这些单元测试 。
setUp与tearDown
可以在单元测试中编写两个特殊的setUp()和tearDown()方法 。这两个方法会分别在每调用一个测试方法的前后分别被执行 。
setUp()和tearDown()方法有什么用呢?设想你的测试需要启动一个数据库,这时,就可以在setUp()方法中连接数据库,在tearDown()方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码:
class TestDict(unittest.TestCase):
def setUp(self):
print 'setUp...'
def tearDown(self):
print 'tearDown...'
可以再次运行测试看看每个测试方法调用前后是否会打印出setUp...和tearDown... 。
python函数单元测试的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、python函数单元测试的信息别忘了在本站进行查找喔 。
推荐阅读
- 如何给餐厅做公众号推广,餐厅公众号推文怎么写
- 包含720sap的词条
- 海南网站设计软件手机安卓,海口网站设计制作
- c语言多个if函数嵌套 c语言if多重嵌套
- java代码不能输出中文,为什么java输出中文是乱码
- 国外服务器账户密码,登录国外服务器
- 发你视频是什么软件,你到底知不知道发视频是什么
- mysql是怎么运行的下载 mysql下载流程
- 苹果ios11能不能降系统,苹果12系统能不能降到10