单元测试就是要模仿程序的执行过程,然后捕捉运行结果,判断是否和预想的一样,总之目的就是要使单元测试通过
python自带的unittest就可以帮我们完成这个
unittest中的 方法:
先看一个简单的示例:
import mock
import unittest
from dock_slots.lib.push import Push
class TestPush(unittest.TestCase):
def setUp(self):
self.user_id_list = [[1, 702], [2, 702], [2, 703], ]
self.msg = {"aps":
{"alert": "some messages",
"sound": "default",
"badge": 1},
"extra": {}
}
self.patcher_account = mock.patch(
"dock_slots.lib.user.Account")
self.account = self.patcher_account.start()
account_instance = mock.Mock()
self.account.return_value = account_instance
account_instance.device_manager.device.to_dict.return_value = {
# "dvc_typ": "ios",
"dvc_tkn": "a4e9acd861ea1d1c6*********"
}
def tearDown(self):
pass
def test_send(self):
p = Push(self.user_id_list, self.msg)
status = p.send()
self.assertEqual(status, True)
def test_ParameterException(self):
pass
if __name__ == '__main__':
unittest.main()
- 编写单元测试时,需要继承一个
unittest.TestCase
类 - setup 方法和 teardown 方法,是特殊方法,表示每个测试方法开始执行和测试结束时执行的函数,如果有要导入的配置,全局变量,或者打开什么文件,就可以在setup中写,如果要最终要关闭文件,就可以在teardown中写。
- 如果是测试方法,就要以
test_
开头,否则不会执行
每一个测试,都应该写一个测试方法 -
unittest.TestCase
为我们提供了很多内置的条件判断,最常用的是,assertEquarls()
就是判断是否相等,比如
self.assertEquals(abs(-1), 1) # 断言函数返回的结果与1相等
此外还有 ,assertRaises
,用来判断是否使我们期望的异常
- 说一下这个mock,mock是一个支持单元测试的库,可以用来模拟对象,用一个mock对象来模拟真实的python对象。
假如我们的测试中需要从真实的服务器上拿数据,不能真的去连接服务器,此时就可以实例化一个mock对象来模拟这个连接服务器的过程,只需要返回我们想要的数据就行了
在上面这个例子中,我们需要从数据库中拿dvc_typ 和 dvc_tkn ,但是没办法连线上的数据库,所以用一个mock来替换这个对象,直接返回需要的数据就行了
这个mock.patch, 还有一种用法,就是mock.patch.object(类,要替换的类里的方法)
- 执行单元测试的时候,比如测试文件是test_pu.py ,测试的时候在终端里输入命令,先进入文件目录,然后:
python -m unnittest test_pu