单元测试-Unittest框架实践

news2024/12/24 4:58:39

文章目录

  • 1.Unittest简介
    • 1.1 自动化测试用例编写步骤
    • 1.2 相关概念
    • 1.3 用例编写规则
    • 1.4 断言方法
  • 2.示例
    • 2.1 业务代码
    • 2.2 编写测试用例
    • 2.3 生成报告
      • 2.3.1 方法1
      • 2.3.2 方法2

1.Unittest简介

Unittest是Python自带的单元测试框架,适用于:单元测试、Web自动化、App自动化、接口自动化等测试用例的开发与执行。

1.1 自动化测试用例编写步骤

1. 初始化	-	用例之前的动作
2. 执行		- 	具体用例逻辑
3. 断言		- 	校验用例执行结果
4. 清理		- 	用例执行后的动作

在unittest中,测试用例的执行顺序是依据ascill码来执行的

在Unittest框架下创建测试用例,步骤如下:
1) 创建test_开头单元测试用例模块。
2) 导入unittest模块。
3) 创建Test开头测试类。继承unittest.TestCase类。
4) 添加setUp()、tearDown()、setUpClass()、tearDownClass() 函数。
5) 创建test_测试方法。
6) 调用unittest.main()方法,该方法会搜索该模块下所有以test开头的测试用例方法并执行。

1.2 相关概念

概念:
1. test case:测试用例
  ——lass TestLogin(unittest.TestCase):  #继承unittest.TestCase类
2. test suite:测试套件/测试集
3. test loader:测试加载
4. test runner:运行器、执行器
5. fixture:夹具,前置准备和后置清理

1.3 用例编写规则

1. .py模块命名规则:test_
2. 用例类名命名规则:Test
3. 方法命名规则:def test_

1.4 断言方法

注意:
如果断言成功则该条测试用例通过;
断言失败则该条测试用例执行失败,且会抛出AssertionError错误;
以下断言方法中,都有一个msg参数,默认为None。如果msg参数有对应的值,则断言失败后该msg的值会作为失败信息返回,
如 assertEqual(a, b, msg="a与b不相等!")
断言方法含义
assertEqual(a, b)判断 a == b
assertNotEqual(a, b)判断 a != b
assertTrue(x)判断 bool(x) is True
assertFalse(x)判断 bool(x) is False
assertIs(a, b)判断 a is b
assertIsNot(a, b)判断 a is not b
assertIsNone(x)判断 x is None
assertIsNotNone(x)判断 x is not None
assertIn(a, b)判断 a in b
assertNotIn(a, b)判断 a not in b
assertIsInstance(a, b)判断 isinstance(a, b)
assertNotIsInstance(a, b)判断 not isinstance(a, b)

2.示例

2.1 业务代码

创建业务代码:calculator.py

# -*- coding: utf-8 -*-
"""
Author: zhangsan
date:   2024/12/18 14:05
Description:    

"""


class Math():
    def __init__(self, a, b):
        self.a = int(a)
        self.b = int(b)

    def sum(self):
        # 求和
        return self.a + self.b

    def sub(self):
        # 求差
        return self.a - self.b

2.2 编写测试用例

# -*- coding: utf-8 -*-
"""
Author: zhangsan
date:   2024/12/18 14:07
Description:    

"""

import unittest
from example_unittest.calculator import Math


class TestSum(unittest.TestCase):
    """测试Math类中的sum方法"""

    # 注意装饰器必须要有
    @classmethod
    def setUpClass(cls):
        # 作用于测试类
        print(f"开始执行测试用例类:{cls.__name__}...")

    @classmethod
    def tearDownClass(cls):
        # 作用于测试类
        print(f"测试用例{cls.__name__}类执行结束。")

    def setUp(self) -> None:
        # 作用于测试方法
        # 每个用例执行前,都会执行一次,用于初始化测试环境
        print(f"开始执行测试用例:{self._testMethodName}...")

    def tearDown(self) -> None:
        # 作用于测试方法
        # 每个用例执行后,都会执行一次,用于清理测试环境
        print(f"测试用例{self._testMethodName}执行结束。")

    def test_sum01(self):
        # 使用正数进行测试
        m = Math(3, 4)
        self.assertEqual(m.sum(), 7)

    def test_sum02(self):
        # 使用负数进行测试
        m = Math(-1, -2)
        self.assertEqual(m.sum(), -3)

    def test_sum03(self):
        # 使用正负数混合进行测试
        m = Math(3, -4)
        self.assertEqual(m.sum(), -1)

    def test_sum04(self):
        # 使用浮点数进行测试
        try:
            m = Math(3.5, 4.6)
        except AssertionError as e:
            print(f"执行用例失败:{e}")
        else:
            self.assertNotEquals(m.sum(), 8.1)

    def test_sum05(self):
        # 使用零进行测试
        m = Math(0, 0)
        self.assertEqual(m.sum(), 0)

    def test_sum06(self):
        # 使用整型和字符串进行测试
        with self.assertRaises(ValueError):
            Math("a", "b")

if __name__ == '__main__':
    unittest.main()

2.3 生成报告

2.3.1 方法1

# -*- coding: utf-8 -*-
"""
Author: zhangsan
date:   2024/12/18 14:36
Description:    

"""
import unittest
# 导入测试用例模块
from testcase.test_sum import TestSum

# 方法1:
# 第一步:创建TestSuite实例
# suite = unittest.TestSuite()

# 第二步:将测试用例添加至TestSuite
# 方式1,添加单条测试用例
# suite.addTest(TestSum('test_sum01'))  # addTest()里参数格式为:测试类('测试方法')
# suite.addTest(TestSum('test_sum02'))

# 方式2,添加多条测试用例
# suite.addTests([TestSum('test_sum01'), TestSum('test_sum02')])

# 方法2:
# 创建一个加载对象
# loader = unittest.TestLoader()
# suite.addTest(loader.loadTestsFromTestCase(TestSum))

# 方法3:不需要创建unittest.TestSuite()
test_dir = './testcase'
suite = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')

# 第三步:创建TextTestRunner实例
# 创建TextTestRunner实例
# runner = unittest.TextTestRunner()
# 使用run()方法运行测试套件(即运行测试套件中的所有用例)
# runner.run(suite)


# 生成测试报告:HTMLTestRunner无法安装,不能使用
# import HTMLTestRunner
# with open('./report/report.html', 'wb') as f:
#     runner = HTMLTestRunner.HTMLTestRunner(stream=f, title="测试报告", description="测试描述")
#     runner.run(suite)

#导入BeautifulReport模块,这个模块也是生成报告的模块,但是比HTMLTestRunner模板好看
# pip3 install BeautifulReport
# from BeautifulReport import BeautifulReport as bf
#
# run = bf(suite) #实例化BeautifulReport模块
# run.report(filename='test',description='这个描述参数是必填的')


# 测试报告模板运行程序:unittestreport
# pip3 install unittestreport
import unittestreport
runner = unittestreport.TestRunner(suite, filename="report.html",
                 report_dir="./reports",
                 title='测试',
                 tester='张三',
                 desc="自测使用",
                 templates=4)
runner.run()

在这里插入图片描述

2.3.2 方法2

# -*- coding: utf-8 -*-
"""
Author: zhangsan
date:   2024/12/18 14:36
Description:    

"""
import unittest
# 导入测试用例模块
from testcase.test_sum import TestSum

# 方法1:
# 第一步:创建TestSuite实例
# suite = unittest.TestSuite()

# 第二步:将测试用例添加至TestSuite
# 方式1,添加单条测试用例
# suite.addTest(TestSum('test_sum01'))  # addTest()里参数格式为:测试类('测试方法')
# suite.addTest(TestSum('test_sum02'))

# 方式2,添加多条测试用例
# suite.addTests([TestSum('test_sum01'), TestSum('test_sum02')])

# 方法2:
# 创建一个加载对象
# loader = unittest.TestLoader()
# suite.addTest(loader.loadTestsFromTestCase(TestSum))

# 方法3:不需要创建unittest.TestSuite()
test_dir = './testcase'
suite = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')

# 第三步:创建TextTestRunner实例
# 创建TextTestRunner实例
# runner = unittest.TextTestRunner()
# 使用run()方法运行测试套件(即运行测试套件中的所有用例)
# runner.run(suite)


# 生成测试报告:HTMLTestRunner无法安装,不能使用
# import HTMLTestRunner
# with open('./report/report.html', 'wb') as f:
#     runner = HTMLTestRunner.HTMLTestRunner(stream=f, title="测试报告", description="测试描述")
#     runner.run(suite)

#导入BeautifulReport模块,这个模块也是生成报告的模块,但是比HTMLTestRunner模板好看
# pip3 install BeautifulReport
from BeautifulReport import BeautifulReport as bf

run = bf(suite) #实例化BeautifulReport模块
run.report(filename='test',description='这个描述参数是必填的')


# 测试报告模板运行程序:unittestreport
# pip3 install unittestreport
# import unittestreport
# runner = unittestreport.TestRunner(suite, filename="report.html",
#                  report_dir="./reports",
#                  title='测试',
#                  tester='张三',
#                  desc="自测使用",
#                  templates=4)
# runner.run()

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

带有 Elasticsearch 和 Langchain 的 Agentic RAG

作者:来自 Elastic Han Xiang Choong 讨论并实现 Elastic RAG 的代理流程,其中 LLM 选择调用 Elastic KB。 更多阅读:Elasticsearch:基于 Langchain 的 Elasticsearch Agent 对文档的搜索。 简介 代理是将 LLM 应用于实际用例的…

[react 3种方法] 获取ant组件ref用ts如何定义?

获取ant的轮播图组件, 我用ts如何定义? Strongly Type useRef with ElementRef | Total TypeScript import React, { ElementRef } from react; const lunboRef useRef<ElementRef<typeof Carousel>>(null); <Carousel autoplay ref{lunboRef}> 这样就…

stm32制作CAN适配器5--WinUsb上位机编写

上次我们要stm32制作了一个基于winusb有canfd适配器&#xff0c;今天我们来制作一个上位机程序来进行报文收发。 上位机还是用以前写好的&#xff0c;只是更改下dll文件。 项目链接器&#xff0c;输入&#xff0c;附加依赖项中增加winusb.lib winusb初始化&#xff1a;#incl…

C/C++圣诞树

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C…

图解HTTP-HTTP报文

参考资料&#xff1a;图解HTTP HTTP报文 用于HTTP协议交互的信息被称为HTTP报文。请求端的HTTP请求报文&#xff0c;响应端&#xff08;服务器端&#xff09;的叫做响应报文。HTTP报文本身是由多行&#xff08;CR LF作为换行符&#xff09;数据行构成的文本。 请求报文及响…

机器学习基础算法 (一)-线性回归

python 环境的配置参考 从零开始&#xff1a;Python 环境搭建与工具配置 线性回归的 Python 实现 线性回归是一种经典的机器学习算法&#xff0c;用于预测连续的目标变量。它假设目标变量和特征之间存在线性关系。本文将详细介绍线性回归的原理、Python 实现、模型评估和调优&…

Java字符串的|分隔符转List实现方案

字符串处理 问题背景代码实现代码优化原因分析实现方案 注意事项异常处理Maven未识别异常 问题背景 在项目组对账流程中&#xff0c;接收对方系统的对账文件&#xff0c;数据以|为分隔符&#xff0c;读取文件内容&#xff0c;分条入库。 代码实现 Java中将字符串转给list&am…

【HarmonyOs学习日志(14)】计算机网络之域名系统DNS

域名系统DNS 域名系统DNS——从域名解析出IP地址 文章目录 域名系统DNS概述域名到IP地址的解析 互联网的域名结构命名标准 域名服务器域名的解析过程 概述 域名系统DNS&#xff08;Domain Name System&#xff09;是互联网使用的命名系统&#xff0c;用来把便于人们使用的机器…

LabVIEW与PLC点位控制及OPC通讯

在工业自动化中&#xff0c;PLC通过标准协议&#xff08;如Modbus、Ethernet/IP等&#xff09;与OPC Server进行数据交换&#xff0c;LabVIEW作为上位机通过OPC客户端读取PLC的数据并进行监控、控制与处理。通过这种方式&#xff0c;LabVIEW能够实现与PLC的实时通信&#xff0c…

Restaurants WebAPI(四)——Identity

文章目录 项目地址一、Authentication&#xff08;身份认证&#xff09;1.1 配置环境(解决类库包无法引用)1.2 使用Authentication控制Controller的访问1.3 获取User的Context1.3.1 在Application下创建User文件夹1. 创建User.cs record类封装角色信息2. 创建UserContext.cs提供…

Java-32 深入浅出 Spring - IoC 基础 启动IoC 纯注解方式 SpringConfig web.xml

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

Android Studio创建新项目并引入第三方so外部aar库驱动NFC读写器读写IC卡

本示例使用设备&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bbW3AUC&ftt&id615391857885 一、打开Android Studio,点击 File> New>New project 菜单&#xff0c;选择 要创建的项目模版&#xff0c;点击 Next 二、输入项目名称…

Trimble天宝三维激光扫描仪在建筑工程竣工测量中的应用【沪敖3D】

竣工测量是建筑项目竣工阶段的一个至关重要的环节&#xff0c;它为建筑工程的质量验收和成果核查提供了核心的参考依据。传统的竣工测量方法&#xff0c;如全站仪测量&#xff0c;主要依赖于现场人工操作&#xff0c;存在一些明显的局限性&#xff0c;例如作业时间长、工作量大…

java开发入门学习五-流程控制

流程控制语句 if&#xff0c; if...else&#xff0c; if..else if..else 与前端相同 略 switch case 与前端不同的是case不能使用表达式&#xff0c;使用表达式会报错 class TestSwitch {public static void main(String[] args) {// switch 表达式只能是特定的数据类型…

tslib(触摸屏输入设备的轻量级库)的学习、编译及测试记录

目录 tslib的简介tslib的源码和make及make install后得到的文件下载tslib的主要功能tslib的工作原理tslib的核心组成部分tslib的框架和核心函数分析tslib的框架tslib的核心函数ts_setup()的分析(对如何获取设备名和数据处理流程的分析)函数ts_setup()自身的主要代码ts_setup()对…

深度学习实战车辆目标跟踪【bytetrack/deepsort】

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对车辆目标数据集进行训练和优化&#xff0c;该数据集包含丰富的车辆目标图像样本…

unipp中使用阿里图标,以及闭坑指南

-----------------------------------------------------点赞收藏才是更新的动力------------------------------------------------- unipp中使用阿里图标 官网下载图标在项目中引入使用注意事项 官网下载图标 进入阿里图标网站 将需要下载的图标添加到购物车中 2. 直接下载…

《Vue3实战教程》5:响应式基础

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 响应式基础​ API 参考 本页和后面很多页面中都分别包含了选项式 API 和组合式 API 的示例代码。现在你选择的是 组合式 API。你可以使用左侧侧边栏顶部的“API 风格偏好”开关在 API 风格之间切换。 声明响应式状态…

【ue5学习笔记2】在场景放入一个物体的蓝图输入事件无效?

在场景放入一个物体的蓝图输入事件无效&#xff0c;那是因为你不知道gameMode这个东西这是一个用于设定游戏股则的东西&#xff0c; 就好比你的控制对象&#xff0c;你输入无效是没有指定你当前关卡中指定的控制对象是它。操作方法如下&#xff1a; 1.创建一个gameMode蓝图类并…

OnlineMusic项目测试报告

OnlineMusic项目测试报告 一、项目背景1.1 测试目标及测试任务的概括1.2 被测的系统&#xff0c;代码以及文档等信息 二、测试安排2.1 测试用例设计2.2 测试方案设计 三、测试分类3.1 测试方案3.1.1 功能测试3.1.2 自动化测试3.1.3 性能测试 3.2测试结果性能测试报告 一、项目背…