UnitTest框架

目标:

1.掌握UnitTest框架的基本使用方法

2.掌握断言的使用方法

3.掌握如何实现参数化

4.掌握测试报告的生成

1.定义

(1)框架(framework):为解决一类事情的功能集合。(需要按照框架的规定(套路) 去书写代码)

(2)UnitTest框架:UnitTest是Python自带的一个单元测试框架,用它来做单元测试。

自带的框架(官方): 不需要单外安装, 只要安装了 Python,就可以使用random, json, os, time
第三方框架: 想要使用 需要先安装后使用(pytest)selenium , appium, requests 
单元测试框架: 主要用来做单元测试, 一般单元测试是开发做的.
对于测试来说, unittest 框架的作用是自动化脚本(用例代码) 执行框架(使用unittest框架 来管理运行多个测试用例的)

2.UnitTest核心要素

1.TestCase(测试用例)-》核心
每个 TestCase(测试用例) 都是一个代码文件
​
2.TestSuite(测试套件)
用来管理组装(打包)多个 TestCase(测试用例) 的
​
3.TestRunner(测试执行,测试运行)
用来执行TestSuite(测试套件)的
​
4.TestLoader(测试加载)
对 TestSuite(测试套件) 功能的补充,
​
5.Fixture(测试夹具)
书写在 TestCase(测试用例) 代码中, 是一个代码结构, 可以在每个方法执行前后都会执行的内容

1.TestCase(测试用例)代码文件书写

步骤:
1. 导包 (unittest)
2. 自定义测试类
3. 在测试类中书写测试方法
4. 执行用例
​
# 1.导包
import unittest
​
# 2.自定义测试类 (需要继承unittest模块中的TestCase类)
class TestDome(unittest.TestCase):
    # 3.书写测试方法 即:用例代码(目前没有真正的用例代码,使用print代替)
    #书写要求,测试方法必须以test_开头
    def test_method1(self):
        print('测试方法1')
​
    def test_method2(self):
        print('测试方法2')
​
# 4.执行用例
# 1 将光标放在 类名的后边 运行, 会执行类中的所有的测试方法
# 2 将光标放在 方法名的后边 运行, 只执行当前的方法

2.TestSuite(测试套件) & TestRunner(测试执行)代码书写

步骤:
1. 导包(unittest)
2. 实例化(创建对象)套件对象
3. 使用套件对象添加用例方法
4. 实例化运行对象
5. 使用运行对象去执行套件对象
​
# 1.导包(unittest)
import unittest
#后面添加用例方法的时候导的包
from testcase1 import TestDome1
from testcase2 import TestDome2
​
# 2.实例化(创建对象)套件对象
suite = unittest.TestSuite()
​
# 3. 使用套件对象添加用例方法
# 方式一, 套件对象.addTest(测试类名('方法名'))   # 建议测试类名和方法名直接去复制,不要手写
suite.addTest(TestDome1('test_method1'))
suite.addTest(TestDome1('test_method2'))
suite.addTest(TestDome2('test_method1'))
suite.addTest(TestDome2('test_method2'))
​
# 4. 实例化运行对象
runner = unittest.TextTestRunner()
# 5. 使用运行对象去执行套件对象
# 运行对象.run(套件对象)
runner.run(suite)

3.TestLoader(测试加载)

步骤:
1. 导包
2. 实例化测试加载对象并添加用例 ---> 得到的是 suite 对象
3. 实例化 运行对象
4. 运行对象执行套件对象
​
# 1.导包
import unittest
​
# 2.实例化加载对象并添加使用
# unittest.TestLoader().discover('用例所在路径','用例代码文件名')
# 用例代码路径:推荐使用相对路径;用例代码文件名:可使用*通配符
suite = unittest.TestLoader().discover('./case','test*.py')
​
# 3, 实例化运行对象
# runner = unittest.TextTestRunner()
# # 4, 执行
# runner.run(suite)
​
# 可以将 3 4 步 变为一步
unittest.TextTestRunner().run(suite)

4.Fixture(测试工具)

对一个测试用例环境的初始化和销毁就是一个Fixture
Fixture控制级别:
1.方法级别(掌握)
2.类级别(掌握)
3.模块级别(了解)
​
1.方法级别:在每个测试方法(用例代码) 执行前后都会自动调用的结构
# 方法执行之前
def setUp(self):
    每个测试方法执行之前都会执行
    pass
# 方法执行之后
def tearDown(self):
    每个测试方法执行之后都会执行
    pass
    
​
2.类级别:在每个测试类中所有方法执行前后 都会自动调用的结构(在整个类中 执行之前执行之后个一次)
# 类级别的Fixture 方法, 是一个 类方法
# 类中所有方法之前
@classmethod
def setUpClass(cls):
    pass
# 类中所有方法之后
@classmethod
def tearDownClass(cls):
    pass
    
​
3.模块级别:代码文件,在每个代码文件执行前后执行的代码结构
# 模块级别的需要写在类的外边直接定义函数即可
# 代码文件之前
def setUpModule():
    pass
# 代码文件之后
def tearDownModule():
    pass
​

3.UnitTest断言

1.定义:

断言:让程序代替人工自动的判断预期结果和实际结果是否相符。

断言的结果有两种:
True, 用例通过 ; False, 代码抛出异常, 用例不通过
在 unittest 中使用断言, 都需要通过 self.断言方法来试验

3.断言常用方法:

assertEqual:
self.assertEqual(预期结果, 实际结果) # 判断预期结果和实际结果是否相等
1. 如果相等, 用例通过
2. 如果不相等,用例不通过, 抛出异常
assertIn:
self.assertIn(预期结果, 实际结果) # 判断预期结果是否包含在实际结果中
1. 包含 ,用例通过
2. 不包含, 用例不通过, 抛出异常
assertIn('admin', 'admin') # 包含
assertIn('admin', 'adminnnnnnnn') # 包含
assertIn('admin', 'aaaaaadmin') # 包含
assertIn('admin', 'aaaaaadminnnnnnn') # 包含
assertIn('admin', 'addddddmin') # 不是包含

4.参数化

通过参数的方式来传递数据,从而实现数据和脚本分离,并且可以实现用例的重复执行。
unittest测试框架,本身不支持参数化,但是可以通过安装unittest扩展插件parameterized来实现
工作中场景:
1. 测试数据一般放在 json 文件中
2. 使用代码读取 json 文件,提取我们想要的数据 ---> [(), ()] or [[], []]
​
cmd窗口安装或者在pycharm的终端安装
安装插件:pip install parameterized
(pip 是 Python 中包(插件) 的管理工具, 使用这个工具下载安装插件)
验证:pip list # 查看到 parameterized
新建一个 python 代码文件, 导包验证:from pa... import pa...
​
参数化代码书写
步骤:
1. 导包 unittest/ pa
2. 定义测试类
3. 书写测试方法(用到的测试数据使用变量代替)
4. 组织测试数据并传参

例子2:
data.json文件内容如下:
[
    {
        "desc": "正确的用户名和密码",
        "username": "admin",
        "password": "123456",
        "expect": "登录成功"
    },
    {
        "desc": "错误的的用户名",
        "username": "root",
        "password": "123456",
        "expect": "登录失败"
    },
    {
        "desc": "错误的的密码",
        "username": "admin",
        "password": "123123",
        "expect": "登录失败"
    }
]
​
# 1. 导包 unittest/ pa
import json
import unittest
from parameterized import parameterized
from tools import login
# 组织测试数据 [(), (), ()] or [[], [], []]
def build_data():
    with open('data.json', encoding='utf-8') as f:
        result = json.load(f) # [{}, {}, {}]
        data = []
        for i in result: # i {}
            data.append((i.get('username'),i.get('password'),i.get('expect')))
        return data
# 2. 定义测试类
class TestLogin(unittest.TestCase):
    # 3. 书写测试方法(用到的测试数据使用变量代替)
    @parameterized.expand(build_data())
    def test_login(self, username, password, expect):
        self.assertEqual(expect, login(username, password))
# 4. 组织测试数据并传参(装饰器 @)

5.跳过

对于一些未完成的或者不满足测试条件的测试函数和测试类,可以跳过执行

使用方式:
# 直接将测试函数标记成跳过
@unittest.skip('跳过额原因')
# 根据条件判断测试函数是否跳过 , 判断条件成立, 跳过
@unittest.skipIf(判断条件, '跳过原因')
​
示例代码:
import unittest
# version = 30
version = 29
class TestDemo(unittest.TestCase):
    @unittest.skip('没有什么原因,就是不想执行')
    def test_1(self):
        print('测试方法 1')
    @unittest.skipIf(version >= 30, '版本大于等于 30, 不用测试')
    def test_2(self):
        print('测试方法 2')
    def test_3(self):
        print('测试方法3')

6.测试报告

自带的测试报告
只有单独运行 TestCase 的代码,才会生成测试报告

生成第三方的测试报告
1. 获取第三方的 测试运行类模块 , 将其放在代码的目录中
2. 导包 unittest
3. 使用 套件对象, 加载对象 去添加用例方法
4. 实例化 第三方的运行对象 并运行 套件对象
​
# 1. 获取第三方的 测试运行类模块 , 将其放在代码的目录中
# 2. 导包 unittest
import unittest
from HTMLTestRunner import HTMLTestRunner
# 3. 使用 套件对象, 加载对象 去添加用例方法
suite = unittest.defaultTestLoader.discover('.', 'pa1.py')
# 4. 实例化 第三方的运行对象 并运行 套件对象
# HTMLTestRunner()
#pa1.py涉及的参数如下
# stream=sys.stdout, 必填,测试报告的文件对象(open ), 注意点,要使用 wb 打开
# verbosity=1, 可选, 报告的详细程度,默认 1 简略, 2 详细
# title=None, 可选, 测试报告的标题
# description=None 可选, 描述信息, Python 的版本, pycharm 版本
# file = 'report.html' # 报告的后缀是.html
file = 'report1.html' # 报告的后缀是.html
with open(file, 'wb') as f:
    # runner = HTMLTestRunner(f) # 运行对象
    runner = HTMLTestRunner(f, 2, '测试报告', 'python 3.6.8 ') # 运行对象
    #运行对象执行套件, 要写在 with 的缩进中
    runner.run(suite)
    
    
1. 组织用例文件(TestCase 里边), 书写参数化, 书写断言, 书写 Fixture, 书写 跳过, 如果单个测试测试文
件, 直接运行, 得到测试报告, 如果有多个测试文件, 需要组装运行生成测试报告
2. 使用 套件对象组装, 或者使用 加载对象组装
3. 运行对象 运行
3.1 运行对象 = 第三方的运行类(文件对象(打开文件需要使用 wb 方式))
3.2 运行对象.run(套件对象)
​
import unittest
from HTMLTestRunnerCN import HTMLTestReportCN
# 组装用例方法
suite = unittest.defaultTestLoader.discover('.', '*pa1.py')
# 实例化运行对象
with open('report_cn.html', 'wb') as f:
    runner = HTMLTestReportCN(f)
    runner.run(suite)

要有一个第三方的类库:HTMLTestRunner:用来执行测试用例并生成HTML格式的测试报告

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/165051.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Virtual安装centos后,xshell连接centos

1. 网络使用Host-Only模式动态分配IP,运行 system restart network 后,使用ifconfig查看新的ip,XShell可以直接连上centos, 但是由于使用的是Host-Only模式,centos不能访问网络,只能与宿主机相互通信 2. 网…

快速支持客户知识库的核心优势是什么?

快速支持客户知识库是一个集中存储和组织企业知识的平台,包含了丰富的信息和解决方案,以帮助客户快速解决问题,帮助企业提高客户支持效率和满意度。那么,快速支持客户知识库的核心优势是什么呢? | 1、提高客户自助支持…

VBA之Word应用:文档(Document)的书签

《VBA之Word应用》(版权10178982),是我推出第八套教程,教程是专门讲解VBA在Word中的应用,围绕“面向对象编程”讲解,首先让大家认识Word中VBA的对象,以及对象的属性、方法,然后通过实…

win10无损升级到win11

1,下载win11升级助手 https://download.microsoft.com/download/5/4/c/54c22b82-d0cd-4e34-9a06-b75823a8aede/Windows11InstallationAssistant.exe 2,启动助手开始安装 安装时需要重启数次 3,安装后界面 4,安装后&#xff0c…

ACWSpring1.3

首先,前端写ajax写上我们的访问路径(就在我们前端的源代码里面),我们建了两个包pkController用于前端页面url映射过来一层一层找到我们的RestController返回bot1里面有键值,返回的这就是一个session对象bot1这个map.前端拿到我们bot1里的两个值给到我们前端显示出来 1准备页面:…

苹果签名应用掉签频繁原因排查,以及如何避免

作为一个对iOS生态有着深厚理解的实用技术博主,我明白苹果签名应用掉签对我们的开发和使用带来的困扰。签名在苹果设备中扮演着至关重要的角色,它不仅确保了应用来源的合法性,也影响着应用的顺畅运行。 今天,我将和您一同探讨苹果…

云存储与物理存储:优缺点对比分析

当您需要存储数字文件时,您有两个基本选择:云存储和物理存储。 云存储允许您通过互联网将文件保存在云存储提供商运营的服务器上。这些公司通常在多个数据中心制作文件的备份副本,并使用复杂的加密来保护它们。您可以从任何连接互联网的设备访…

ZC序列理论学习及仿真

文章目录 前言一、ZC 序列理论1、基本概念2、表达式3、ZC 序列一些定义①、自相关②、循环移位③、循环自相关④、循环互相关二、ZC 序列性质1、性质 1:恒包络,即等模2、性质 2:零循环自相关3、性质 3:固定循环互相关4、其他性质①、傅里叶变换后仍是 ZC 序列②、低峰均比③…

docker的基本使用以及使用Docker 运行D435i

1.一些基本的指令 1.1 容器 要查看正在运行的容器&#xff1a; sudo docker ps 查看所有的容器&#xff08;包括停止状态的容器&#xff09; sudo docker ps -a 重新命名容器 sudo docker rename <old_name> <new_name> <old_name> 替换为你的容器名称…

基环树(pseudotree)入门

目录 无向基环树找环&#xff0c;[题目](https://www.luogu.com.cn/problem/P8655)拓扑排序找环并查集找环dfs找环 内向基环树[2876. 有向图访问计数](https://leetcode.cn/problems/count-visited-nodes-in-a-directed-graph/description/)[2127. 参加会议的最多员工数](https…

leetcode34.排序数组中查找元素第一个和最后一个位置两种解题方法(超详细)

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/description/?envTypelist&envIdZCa7r67M这道题&#xff0c;读者可能会说这道题有什么好…

Flutter笔记:拖拽手势

Flutter笔记 拖拽手势 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134485123 目 录 1. 概述2. 垂直拖…

argocd

部署argocd https://github.com/argoproj/argo-cd/releases kubectl create namespace argocd kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.9.1/manifests/install.yaml官网 https://argo-cd.readthedocs.io/en/stable/ kubectl crea…

从 0 开始手写一个 Mybatis 框架,三步搞定!

MyBatis框架的核心功能其实不难&#xff0c;无非就是动态代理和jdbc的操作&#xff0c;难的是写出来可扩展&#xff0c;高内聚&#xff0c;低耦合的规范的代码。本文完成的Mybatis功能比较简单&#xff0c;代码还有许多需要改进的地方&#xff0c;大家可以结合Mybatis源码去动手…

计算机毕业设计选题推荐-点餐微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

AOT:一个.Net 8最牛逼和最受欢迎关注的功能!

这次.Net 8发布&#xff0c;更新了诸多功能&#xff0c;但从各个编程社区看到大家讨论和交流最多的&#xff0c;还是AOT这个功能。 AOT本身在.Net 7就开始引入了&#xff0c;但这次.Net 8做了诸多更新&#xff1a; 1、增加了macOS 平台的 x64 和 Arm64 体系结构的支持&#x…

最新版微信如何打开青少年模式?

最新版微信如何打开青少年模式&#xff1f; 1、将手机微信升级到最新版&#xff0c;并打开后点击底部我的进入&#xff1b; 2、在我的内&#xff0c;找到并点击设置进入&#xff1b; 3、在设置内找到青少年模式&#xff0c;并点击进入开启微信青少年模式&#xff1b; 原文来源…

一、MySQL-Replication(主从复制)

1.1、MySQL Replication 主从复制&#xff08;也称 AB 复制&#xff09;允许将来自一个MySQL数据库服务器&#xff08;主服务器&#xff09;的数据复制到一个或多个MySQL数据库服务器&#xff08;从服务器&#xff09;。 根据配置&#xff0c;您可以复制数据库中的所有数据库&a…

QT下使用QChart绘制曲线

目录 头文件内容构造函数AddSeries方法UpdateSeries方法AppendSeriesData方法SetLegendVisiableSetRubberBandCPP内容测试函数 需要用到的头文件&#xff1a; #include <QtCharts/QChart> #include <QtCharts/QChartView> #include <QtCharts/QValueAxis> #…

贝锐蒲公英云AP,企业WiFi功能如何使用?

1. 功能介绍 基于WPA2-EAP安全认证技术&#xff0c;为企业提供了一套易用安全的企业无线网络,实现企业员工通过蒲公英客户端一键连接企业无线WiFi。自动分配一人一帐一密&#xff0c;无需配置证书或手动输入密码&#xff0c;减少沟通成本&#xff0c;方便快捷&#xff0c;提高…
最新文章