当前位置: 首页 > news >正文

Python-UnitTest框架

目标:
1.掌握UnitTest框架的基本使用方法
2.掌握断言的使用方法
3.掌握如何实现参数化
4.掌握测试报告的生成


文章目录

  • (一)UnitTest框架
    • 一、概念:
    • 二、为什么要使用 UnitTest 框架?
    • 三、UnitTest 核心要素(unittest的组成)
  • (二)TestCase测试用例的书写
  • (三)TestSuite 和 TestRunner 的书写
  • (四)TestLoader 和 Fixture 的使用
    • 一、TestLoader 和 Fixture
      • 1. TestLoader(测试加载)
      • 2. Fixture(测试夹具)
        • 方法级别
        • 类级别
        • 模块级别
    • 二、断言
    • 三、参数化
    • 四、测试报告


(一)UnitTest框架

一、概念:

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

自带的框架:只要安装了Python,就可以使用。
第三方框架:需要先安装后使用(pytest)

单元测试框架:主要用来做单元测试,一般单元测试是开发做的。
对于测试来说,unittest 框架的作用是自动化脚本(用例代码)执行框架
(使用unittest框架来管理运行多个测试用例)

二、为什么要使用 UnitTest 框架?

① 能够组织多个用例去执行
② 提供丰富的断言方法
③ 能够生成测试报告

三、UnitTest 核心要素(unittest的组成)

  1. TestCase(最核心的模块)

TestCase(测试用例)
主要作用:每个TestCase都是一个代码文件,在这个代码文件中,来书写真正的用例代码

  1. TestSuite

TestSuite(测试套件)
管理组装(打包)多个 TestCase(测试用例)

  1. TestRunner

TestRunner(测试执行,测试运行)
执行TestSuite

  1. TestdLoader

TestLoader(测试加载)
功能是对TestSuite功能的补充,管理组装(打包)多个TestCase

  1. Fixture

Fixture(测试夹具)
书写在TestCase代码中,是一个代码结构,可以在每个方法执行前后都会执行的内容


(二)TestCase测试用例的书写

步骤
1.导入包(unittest)
2.自定义测试类
3.在测试类中书写测试方法
4.执行用例

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

4.1的运行结果:
在这里插入图片描述

4.2的运行结果:
在这里插入图片描述

在这里插入图片描述


(三)TestSuite 和 TestRunner 的书写

步骤:
1.导入包(unittest)
2.实例化(创建对象)套件对象
3.使用套件对象添加用例方法
4.实例化运行对象
5.使用运行对象去执行套件对象

用例文件:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

再新建一个stu02_suite_runner.py文件:

# 1.导入包
import unittest
from stu02_testcase1 import TestDemo1
from stu02_testcase2 import TestDemo2
from stu02_testcase3 import TestDemo3# 2.实例化(创建对象)套件对象
suite = unittest.TestSuite()# 3.使用套件对象添加用例方法
# 套件对象.addTest(测试类名('方法名'))
suite.addTest(TestDemo1('test_method1'))
suite.addTest(TestDemo1('test_method2'))
suite.addTest(TestDemo2('test_method1'))
suite.addTest(TestDemo2('test_method2'))
suite.addTest(TestDemo3('test_method1'))
suite.addTest(TestDemo3('test_method2'))# 4.实例化运行对象
runner = unittest.TextTestRunner()# 5.使用运行对象去执行套件对象
# 运行对象.run(套件对象)
runner.run(suite)

▲ 运行结果:
在这里插入图片描述

点:用例通过
F:用例不通过
E:error,用例代码有问题


(四)TestLoader 和 Fixture 的使用

一、TestLoader 和 Fixture

1. TestLoader(测试加载)

作用和 TestSuite 的作用是一样的,对 TestSuite 功能的补充,
用来组装测试用例。

使用步骤:
1.导入包
2.实例化测试加载对象并添加用例 ——>得到的是 suite 对象
3.实例化 运行对象
4.运行对象执行套件对象

在这里插入图片描述

# 1.导入包
import unittest# 2.实例化加载对象并添加用例
# unnittest.TestLoader().discover('用例所在的路径','用例的代码文件名')
# 用例所在的路径,建议使用相对路径,用例的代码文件名可以使用 *(任意多个任意字符) 通配符
suite = unittest.TestLoader().discover('./case','stu01_*.py')# 3.实例化运行对象
runner = unittest.TextTestRunner()# 4.执行
runner.run(suite)

可以将3,4步变为一步

# 1.导入包
import unittest# 2.实例化加载对象并添加用例
# unnittest.TestLoader().discover('用例所在的路径','用例的代码文件名')
# 用例所在的路径,建议使用相对路径,用例的代码文件名可以使用 *(任意多个任意字符) 通配符
suite = unittest.TestLoader().discover('./case','stu01_*.py')# 3.实例化运行对象
inittest.TextTestRunner().run(suite)

2. Fixture(测试夹具)

Fixture(测试夹具)是一种代码结构。
在某些特定的情况下,会自动执行。

方法级别

在每个测试方法(用例代码)执行前后都会自动调用的结构。

# 方法执行之前
def setup(self):每个测试方法执行之前都会执行pass# 方法执行之后
def teardown(self):每个测试方法执行之后都会执行pass
类级别

在每个测试类中所有方法执行前后,都会自动调用的结构(在整个类中,执行之前、执行之后各一次)

# 类级别的Fixture方法,是一个 类方法
# 类中所有方法之前
@classmethod
def setupClass(cls):pass# 类中所有方法之后
@classmethod
def teardownClass(cls):pass
模块级别

模块:代码文件
在每个代码文件执行前后执行的代码结构

# 模块级别的需要写在类的外边直接定义函数即可
# 代码文件之前
def setupModule():pass# 代码文件之后
def teardownModule():pass

方法级别和类级别的 前后的方法,不需要同时出现,根据用例代码的需要自行选择使用。


二、断言

断言:让程序代替人工判断测试程序执行结果是否符合预期结果的过程。

常用的 UnitTest 断言方法:

序号断言方法断言描述
1assertTrue(expr,msg=None)验证expr是true,如果为false,则fail
2assertFalse(expr,msg=None)验证expr是false,如果为true,则fail
3assertEqual(expected,actual,msg=None)验证expected==actual,不等则fail
4assertNotEqual(first,second,msg=None)验证first!=second,相等则fail
5assertIsNone(obj,msg=None)验证obj是None,不是则fail
6assertIsNotNone(obj,msg=None)验证obj不是None,是则fail
7assertIn(member,container,msg=None)验证是否member in container
8assertNotIn(member,container,msg=None)验证是否member not in container

Eg:

import unittestclass TestAssert(unittest.TestCase):def test_equal(self):self.assertEqual(1 + 2, 3)  # 相等,断言通过def test_in(self):self.assertIn("a", ["a", "b", "c"])  # "a"在列表中,通过def test_raise(self):# 断言除以0会抛出 ZeroDivisionErrorwith self.assertRaises(ZeroDivisionError):1 / 0

三、参数化

在测试方法中,使用变量来代替具体的测试数据,然后使用传参的方法将测试数据传递给方法的变量。

1.测试数据一般放在json文件中
2.使用代码读取json文件,提取我们想要的数据——>[(),(0][[],[]]

安装插件:pip install parameterized

代码:

1.导入包 unittest/ pa
2.定义测试类
3.书写测试方法(用到的测试数据使用变量代替)
4.组织测试数据并传参

四、测试报告

pip install html-testRunner

    runner = HtmlTestRunner.HTMLTestRunner(output='reports',  # 报告输出目录report_title='测试报告',  # 报告标题descriptions='XX测试结果'  # 报告描述)
http://www.dtcms.com/a/523855.html

相关文章:

  • 模型-模型压缩:量化、剪枝、蒸馏、二值化
  • UE5 蓝图-12:pawn蓝图,轴映射-鼠标右键,补充轴映射与操作映射的区别。相机的旋转俯仰逻辑,伸缩逻辑,浮点差值函数 FInterpTo;
  • Vcenter7使用主机配置文件重置ESXI主机 root 密码
  • STL 容器:List
  • 做网站销售好累网上开店的货源渠道有哪些
  • 图像,视频Lora模型训练的Timestep Type时间步类型
  • 告别云端依赖!ComfyUI本地化视频生成实战教程+cpolar实战
  • Android16之如何获取APP、Bin进程的UID(二百六十三)
  • 在JavaScript / HTML中,无法通过开发者工具查看DOM元素中input里输入的密码
  • 像素塔防游戏:像素守卫者
  • 什么是栈?深入理解 JVM 中的栈结构
  • Go Web 编程快速入门 07.2 - 模板(2):解析与执行(含Demo)
  • 公司用wordpress建站用花钱大连网站设计开发
  • 建设网站需要下载神呢软件吗重庆企业网站推广公司
  • 常规面光源在工业视觉检测上的应用
  • 数据结构——直接插入排序
  • 如何开公司做网站素材免费网站
  • Spring Boot 配置优先级
  • 【架构】-- Nightingale:云原生监控告警平台的深度解析
  • 【Leetcode】
  • 以LIS为突破口的全栈信创实践——浙江省人民医院多院区多活架构建设样本
  • 使用 IntelliJ IDEA 连接 Docker
  • Maya Python入门: polySphere()球体的形状节点操作
  • 目前最好的引流方法上海专业seo
  • 第一篇使用HTML写一个随机点名网页
  • 沈阳网站设计制作电子商务网站上线活动策划
  • 使用 Undertow 替代 Tomcat
  • 搜维尔科技将携手Xsens|Haption|Tesollo|Manus亮相IROS 2025国际智能机器人与系统会议
  • 第四章-Tomcat线程模型与运行方式
  • 【PB案例学习笔记】-46在数据窗口中编辑数据