单元测试

单元测试概念
  • 为什么需要单元测试
    • Web程序开发过程一般包括以下几个阶段:[需求分析,设计阶段,实现阶段,测试阶段]。其中测试阶段通过人工或自动来运行测试某个系统的功能。
    • 目的是检验其是否满足需求,并得出特定的结果,以达到弄清楚预期结果和实际结果之间的差别的最终目的
  • 测试的分类
    • 单元测试(与开发人员相关)
      • 对单独的代码块(例如函数)分别进行测试,以保证它们的正确性
    • 集成测试
      • 对大量的程序单元的协同工作情况做测试
    • 系统测试
      • 同时对整个系统的正确性进行检查,而不是针对独立的片段
  • 什么是单元测试
    • 当我们的某些功能代码完成后,为了检验其是否满足程序的需求。可以通过编写测试代码,模拟程序运行的过程,检验功能代码是否符合预期。
    • 单元测试就是开发者编写一小段代码,检验目标代码的功能是否符合预期。通常情况下,单元测试主要面向一些功能单一的模块进行。
    • 在Web开发过程中,单元测试实际上就是一些“断言”(assert)代码,判断执行结果是否符合预期
单元测试步骤
  • 先定义一个类,继承自unittest.TestCase
    • import unittest
    • class TestClass(unitest.TestCase): 
      • ...
  • 在测试类中定义两个方法
    • setUp测试案例启动前调用,可以设置初始化代码
      • def setUp(self):
        • client = app.test_client()     获取flask中对应的测试客户端对象,通过它模拟发送请求
        • app.testing = True  设置app为测试模式,异常会定位到内测试代码导致异常的代码
        • pass
    • tearDown所有测试案列完成之后调用,可以用来关闭上下文管理器等
      • def tearDown(self):
        • ...
  • 在测试类中,编写测试代码
    • from  main import app    
    • import json
      • def test_function(self):    注意测试的方法一定要以test开头,才能被识别
        • self.client.post('/login', data={ })    通过测试客户端发起post请求,传入数据,获取响应
        • response_data = response.data  获取响应中响应体的数据,字符串类型数据
        • resp_dict = json.loads(resp_data)    将字符串转换成字典
    • self.assert 。。。。。。     再通过获取的值进行assert断言
  • 运行测试代码
    • 第一种方法
      • 直接右键运行
    • 第二种方法
      • unittest.main()    通过调用main方法来启动测试代码
登录测试
数据库测试

程序断言的使用(assert)
  • 程序断言的作用
    • 断言就是判断一个函数或对象的一个方法所产生的结果是否符合你期望的那个结果。
    • python中assert断言是声明布尔值为真的判定,如果表达式为假会抛出异常。
    • 单元测试中,一般使用assert来断言结果。
  • 程序断言的使用示例
    • assert isinstance(num1, int)    断言num1是一个int类型,不是的话抛出异常
  • 常用的断言方法
    • 系统自带断言
      • assert 后面的布尔表达式为True,则pass
    • unitest.TestCase封装的断言,通过self.assert来调用
      • assertEqual 如果两个值相等,则pass
      • assertNotEqual 如果两个值不相等,则pass
      • assertTrue 判断bool值为True,则pass
      • assertFalse 判断bool值为False,则pass
      • assertIsNone 不存在,则pass
      • assertIsNotNone 存在,则pass

刘小恺(Kyle) wechat
如有疑问可联系博主