IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> Python学习28:unittest框架 -> 正文阅读

[开发测试]Python学习28:unittest框架

unittest是python内置的单元测试框架,具备编写测试用例,组织用例,执行用例,输出报告等自动化框架的条件。

一、单元测试的简介

1. 什么是单元测试?

2. 为什么要做单元测试?

二、单元测试实战

2.1 登录函数详细设计

……

【登录函数】

参数:

? 用户名、密码,用户名和密码不能为空

返回值:

? 用户名:不能为空,如果为空,返回{“code”: 0, “msg”: “所有的参数不能为空”};

? 密码:不能为空,如果为空,返回{“code”: 0, “msg”: “所有的参数不能为空”};

? 用户名错误:{“code”: 0, “msg”: “账号或密码不正确”}

? 密码错误:{“code”: 0, “msg”: “账号或密码不正确”}

? 登录成功:{“code”: 1, “msg”: “登录成功”}

……

2.2 设计测试用例

用例描述输入数据预期结果实际结果
账号密码正确
账号正确,密码错误
账号错误,密码正确
账号为空
密码为空

2.3 编码

2.4 使用普通方法测试代码

2.5使用单元测试方法测试代码

三、单元测试总结

3.1 单元测试框架unittest的架构

  • TestCase:一个testcase的实例就是一个测试用例:
  • TestSuite:多个测试用例集合在一起。
  • TestLoader:是用来加载TestCase到TestSuite中的
  • TextTestRunner:用来执行测试用例的。
  • fixture:包括setUp 和tearDown两个方法,分别用于创建测试环境和销毁测试环境。

3.2 使用unittest做单元测试的步骤

  • 导入unittest模块

  • 导入被测对象

  • 创建一个测试类,并继承unittest.TestCase

  • 重写setUp和tearDown方法(如果有初始化条件和结束条件)

  • 以函数的形式写测试项:函数名以test_开头。

  • 使用unittest.main()运行测试用例


import unittest
class LoginCheckTest(unittest.TestCase):
  
      def setUp(self) -> None:
          print("每条用例")
  
      def test_login(self):
          self.assertEqual(0, login_check('lemon','123456').get('code'))
  
      def test_password_error(self):
          self.assertEqual(1,login_check('lemon','8888222').get('code'))
  
      def test_user_error(self):
          self.assertEqual(1, login_check('aaaabc', '123456').get('code'))
  
      if __name__ == '__main__':
          unittest.main()

运行unittest.main()时,unittest将自动执行test开头的函数,函数的运行顺序按字母顺序。

3.3 常用断言函数说明

方法检查功能描述
assertEqual(self, first, second, msg=None)a==b如果两个对象不相等,则失败,msg可以用来指定失败时的提示信息。
assertNotEqual(self, first, second, msg=None):a!=b断定预期结果a和实际结果b不相等。

四、测试用例的管理

4.1 常用函数说明

函数功能说明
unittest.TestSuite()创建suite对象
unittest.TestLoader()创建用例加载器
unittest.TestSuite().addTest()向suite中添加用例
unittest.TextTestRunner()创建用例运行器
unittest.TextTestRunner().run(suite)使用用例运行期运行suite

4.2 用例管理的步骤

五、如何生成测试报告

  • 纯文本测试报告:

    创建一个文件,以写的方式的打开

    with open("test_result.txt","w") as f:
       runner = unittest.TextTestRunner(fs)
       runner.run(suite)
    
  • html类型报告:

    使用BeautifulReport模块生成

    环境安装: pip install BeautifulReport

    使用方式

    from BeautifulReport import BeautifulReport
    br = BeautifulReport(suite)
    br.report("登录功能单元测试报告","login__test_report.html")
    

完整代码如下:

import unittest


from tests.test_user import LoginCheckTest

if __name__ == '__main__':
    # 创建套件
    suite = unittest.TestSuite()
    # 添加测试用例到套件suite
    loader = unittest.TestLoader()  # 创建一个 测试加载器对象
    suite.addTest(loader.loadTestsFromTestCase(LoginCheckTest))
    from BeautifulReport import BeautifulReport

    br = BeautifulReport(suite)
    br.report("登录功能单元测试报告", "login__test_report.html")

作业:针对下述代码,使用unittest进行测试。

# user.py
users = [{'user': 'lemon', 'password': '123456'}]
def register(username, password1, password2):
    # 判断是否有参数为空
    if username and  password1 and password2:
        return {"code": 0, "msg": "所有参数不能为空"}
        
    # 注册功能
    for user in users:  # 遍历出所有账号,判断账号是否存在
        if username == user['user']:
            # 账号存在
            return {"code": 0, "msg": "该账户已存在"}
    else:
        if password1 != password2:
            # 两次密码不一致
            return {"code": 0, "msg": "两次密码不一致"}
        else:
            # 账号不存在 密码不重复,判断账号密码长度是否在 6-18位之间
            if 6 <= len(username) >= 6 and 6 <= len(password1) <= 18:
                # 注册账号
                users.append({'user': username, 'password': password2})
                return {"code": 1, "msg": "注册成功"}
            else:
                # 账号密码长度不对,注册失败
                return {"code": 0, "msg": "账号和密码必须在6-18位之间"}
if __name__=="__main__":
    res = register('python14', '123456', '123456')
    print(res)
"""
函数入参:
参数1:账号  
参数2:密码1
参数2:密码2 
注意点:这里的参数都是字符串类型,不需要考虑其他类型。
函数内部处理的逻辑:
    判断是否有参数为空,
    判断账号是否被注册过,
    判断账号密码是否在6-18位之间,
    判断两个密码是否一致。
    上面添加都校验通过才能注册成功,其他情况都注册失败,
对应的返回结果如下:  
    注册成功               返回结果:{"code": 1, "msg": "注册成功"}
    有参数为空,            返回结果 {"code": 0, "msg": "所有参数不能为空"}   
    两次密码不一致          返回结果:{"code": 0, "msg": "两次密码不一致"}
    账户已存在             返回结果:{"code": 0, "msg": "该账户已存在"}
    密码不在6-18位之间      返回结果:{"code": 0, "msg": "账号和密码必须在6-18位之
间"}               账号不在6-18位之间      返回结果:{"code": 0, "msg": "账号和密
码必须在6-18位之间"}
    
作业要求:请设计用例,对此功能函数进行单元测试,           
上面已经被注册的账号:lemon

提示:不需要去关注功能函数内部的代码,也不要改里面的代码,直接复制过去就好,函数内部有bug,
自己设计用例去测。

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 13:02:26  更:2021-07-30 13:02:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 8:51:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码