使用unittest进行单元测试

单元测试就是要模仿程序的执行过程,然后捕捉运行结果,判断是否和预想的一样,总之目的就是要使单元测试通过
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()
  1. 编写单元测试时,需要继承一个unittest.TestCase
  2. setup 方法和 teardown 方法,是特殊方法,表示每个测试方法开始执行和测试结束时执行的函数,如果有要导入的配置,全局变量,或者打开什么文件,就可以在setup中写,如果要最终要关闭文件,就可以在teardown中写。
  3. 如果是测试方法,就要以test_开头,否则不会执行
    每一个测试,都应该写一个测试方法
  4. unittest.TestCase为我们提供了很多内置的条件判断,最常用的是, assertEquarls()就是判断是否相等,比如
self.assertEquals(abs(-1), 1) # 断言函数返回的结果与1相等

此外还有 ,assertRaises,用来判断是否使我们期望的异常

  1. 说一下这个mock,mock是一个支持单元测试的库,可以用来模拟对象,用一个mock对象来模拟真实的python对象。
    假如我们的测试中需要从真实的服务器上拿数据,不能真的去连接服务器,此时就可以实例化一个mock对象来模拟这个连接服务器的过程,只需要返回我们想要的数据就行了
    在上面这个例子中,我们需要从数据库中拿dvc_typ 和 dvc_tkn ,但是没办法连线上的数据库,所以用一个mock来替换这个对象,直接返回需要的数据就行了

这个mock.patch, 还有一种用法,就是mock.patch.object(类,要替换的类里的方法)

  1. 执行单元测试的时候,比如测试文件是test_pu.py ,测试的时候在终端里输入命令,先进入文件目录,然后:
python -m unnittest test_pu

你可能感兴趣的:(使用unittest进行单元测试)