引言
如果以前学过 android 的话,应该对单元测试并不陌生。
不过如果没有学过 android,也请不要紧张,因为单元测试的概念很简单:
单元测试
是用来对一个模块、一个函数或者是对一个类来进行正确性检验的测试工作。
那么他的作用是:
当我们写完一个模块或者一个函数后,可以通过“单元测试”来对这个逻辑做一个验证,如果这个模块的逻辑通过,那么就可以将这个模块应用到我们真实的项目中去,这样就避免了在项目中出错,然后再去找错的风险。(在项目中找各种错误是一件头痛的事情,如果能够提前处理好这种问题,那就再好不过了)
那么怎么去做单元测试呢?
我们来用一个廖雪峰大神的例子来说明一下:
“我们现在想自定义一个类似dict的类:Dict,我们这个类能够比dict多一个功能,就是能够通过类的属性去访问,如”
d=Dict(a=1,b=2)
print(d['a'])
#下面这个使我们想添加的功能
print(d.a)
我们期望定制完我们的Dict类之后,能够通过上方的代码去实现,从而输出正确的结果:
1
1
现在来看我们的代码
#文件mydict.py
class Dict(dict):
def __init__(self,**kw):
super().__init__(**kw)
#通过这个获得属性的方法,实现上方的d.a的调用
def __getattr_(self,key):
try:
return self[key]
except KeyError:
raise AttributeError("'Dict' object has no attribute '%s'" %key)
#通过这个设置属性的方法,实现d.key=value这样的操作,这样使得Dict即用于dict的
# 特点,还具备一般类的特点
def __setattr__(self,key,value):
self[key]=value
注意:下面要写关于单元测试的类了
为了实现单元测试,我们需要引入unittest模块
#文件myunittest.py
import unittest
#导入上方我们写的Dict类
from mydict import Dict
#我们需要单独提供一个类,并且继承unittest.TestCase
class TestDict(unittest.TestCase):
#以test开头的方法就是测试方法,不以test开头的就不被认为是测试方法,在测试的时候就不会执行
def test_init(self):
d=Dict(a=1,b='test')
self.assertEqual(d.a,1)
self.assertEqual(d.b,'test')
self.assertTrue(isinstance(d,dict))
def test_key(self):
d=Dict()
d['key']='value'
self.assertEqual(d.key,'value')
def test_attr():
d=Dict()
d.key='value'
self.assertEqual(d['key'],'value')
self.assertTrue('key' in d)
def test_keyerror(self):
d=Dict();
with self.assertRaises(KeyError):
value=d['empty']
def test_valueerror(self):
d=Dict();
with self.assertRaises(AttributeError):
value=d.empty
好了,这样我们的测试类就写好了,我们发现上面我们用到了
- self.assertEqual()
断言函数返回的结果是否相等 - with self.assertRaise(KeyError)
断言抛出指定类型的error - self,asserTrue()
断言是否为真
编写完测试类,又有了原始的要测试的类,那么现在我们就可以进行测试了
实现测试有两种方法
-
方法1:在测试类的结尾添加两行代码
if __name__=='__main__': unittest.main()
这样就可以把测试类这个文件当做正常的python文件来运行
-
方法2:就是在运行的时候,输入特殊的指令
python3 -m unittest 测试类文件名.py
本方法还是比较常用的,因为他可以进行批量测试,而且还有很多工具能够自动来运行这些单元测试。
我们来看一下项目实操:
我们直接使用第二种方法去跑这个单元测试
这个结果即表明,我们通过单元测试,测试出我们定义的这个Dict类是成立的了
单元测试中的setUp()和tearDown()
setUp()和tearDown()方法的作用是,他们会在调用每一个测试方法的前后分别都执行,这两个方法一般用在在测试前后需要准备资源或者是释放资源的情况下。
比如我们现在有一个单元测试,在调用每个测试方法前后,都需要打开数据库和关闭数据库,这个时候我们用setUp()和tearDown()方法就非常方便了
相关的代码很简单,现在开始演示一下
import unittest
class TestDemo(unittest.TestCase):
def setUp():
print('open database...')
def tearDown():
print('close database....')
def test_test(self):
self.assertTrue(...)
pass
这样,当我们在调用test_test测试方法的时候,python处理器会先调用setUp()方法,然后调用tearDown()方法,极大方便了我们的书写
总结
单元测试很简单,唯一需要我们做的就是多练习,这样就能轻松掌握了。加油!
网友评论