立志成为一名优秀测试开发工程师(第七天)——unittest框架的学习

article/2025/8/13 22:15:01

目录

unittest框架的学习

一、测试类的编写

创建相关测试类cal.py、CountTest.py 

二、常见断言方法

使用unittest单元测试框架编写测试用例CountTest.py 

注意:执行的时候光标一定要放在括号后面,鼠标右键运行

三、对测试环境的初始化和清除模块

四、创建测试套件

五、跳过测试和预期失败

六、测试报告的生成,使用HtmlTestRunner生成测试报告

1.安装HtmlTestRunner.py

2.基本使用方法

3.自定义报告样式

4.高级配置

5.注意事项


unittest框架的学习

unittest是python单元测试框架,是受到JUnit的启发,
与其他语言中的主流单元测试框架有着相似的风格。
其支持测试自动化,配置共享和关键代码测试。
支持将测试样例聚合到测试集中,并将测试与报告框架独立。
它不仅适用于单元测试,还在自动化测试领域占有一席之地。
借助它组织执行测试用例,使用它提供的丰富的断言方法
进行测试结果的比对,并结合HTMLTestRunner生成
测试报告完成整个自动化测试流程。
即:用代码测试代码

unittest是python内置的单元测试框架,不需要,直接导入使用即可 测试用例需要继承unittest.TestCase 属性该类的测试用例其实就是一个实例方法 该测试用例方法,就必须要使用test开头 

一、测试类的编写

cal.pyCountTest.py 展示了如何使用 Python 的 unittest 框架进行单元测试。以下是对代码结构和功能的详细说明:

创建被测类cal.py 

cal.py 定义了一个 count 类,包含基础的数学运算和随机选择功能:

class count:def __init__(self, a, b):self.a = aself.b = bdef add(self):return self.a + self.bdef Subtraction(self):return self.a - self.bdef func(self):return self.a - self.b > 10  # 简化为直接返回布尔值def func2(self):names = ['张三', '李四', '王五', '皮蛋']return random.choice(names)

二、常见断言方法

使用unittest单元测试框架编写测试用例CountTest.py 

常见断言方法 assertEqual()  assertNotEqual() assertTrue()
assertEqual 如果两个值相等则测试通过
assertNotEqual 如果两个值不相等则测试通过
assertTrue()表达式结果是True,返回True

import unittest
from Day.day07.calc import countclass CountTest(unittest.TestCase):#测试加法def test_add(self):#类的实例化 类名加上()c1=count(4,5)#调用方法r=c1.add()#测试的本质是实际结果和需求结果的就比较#断言self.assertEqual(r,11)#测试减法def test_sub(self):#类的实例化c2=count(6,3)#调用减法r=c2.Subtraction()#断言self.assertEqual(r,3)def test_func1(self):c1=count(20,1)r=c1.func()self.assertTrue(r,msg="测试不通过")def test_names(self):c3=count(4,5)r=c3.func2()new_names=['张三','李四','王五','皮蛋','翠花','王峰','李思','花花','草草']self.assertIn(r,new_names,msg="不存在")
if __name__=='__main__':CountTest.main()
注意:执行的时候光标一定要放在括号后面,鼠标右键运行

运行结果:

三、对测试环境的初始化和清除模块

TestFixture 对测试环境的初始化和清除模块
测试用例以来的测试数据准备活动就可以在环境的初始化完成
初始化的时候加了什么,清除的时候就删什么
注意这两个名字一定要写对

模块级别>类级别>用例级别

from Day.day07.calc import count
import unittestdef setUpModule():print("________这是setUpModule_________")
def tearDownModule():print("—————————这是tearDownModule—————————")class CountTest(unittest.TestCase):
#用例的执行顺序按照ASCII码表来进行@classmethoddef setUpClass(cls)->None:print("———————这是setUpClass—————————")#每一个用例执行之前都要执行用例的初始化,用例执行之后,都要执行用例的清除#用例级别的初始化def setUp(self) -> None:print("——----这是setUp-------————")def tearDown(self) -> None:print("---------这是tearDown---------")#类级别的清除@classmethoddef tearDownClass(cls) -> None:print("------这是tearDownClass--------")def test_names(self):c3=count(4,5)r=c3.func2()new_names=['张三','李四','王五','皮蛋','翠花','王峰','李思','花花','草草']print(new_names)self.assertIn(r,new_names,msg="不存在")def test_func(self):print("加油加油加油")def test_add(self):c2=count(2,8)r3=c2.add()self.assertEqual(r3,10)if __name__ =='__main__':CountTest.main()

四、创建测试套件

unittest提供了实现某紫于求的装饰器,在执行测试用例时每个装饰前面加@符号。@unittest.skip(feason):无条件的跳过装饰的测试,说明跳过测试的原因@unittest.skiplf(condition,reason):跳过装饰的测试,如果条件为真。@unittest.skipUnless(condition,reason):跳过装饰的测试,除非条件为真。@unittest.expectedFailure():测试标记为失败,不管执行结果是否失败,统一标记为失败,但不会抛出错误信息。@unittest.expectedFailure #如果断言失败,不计入执行case数目中

方法1.通过addTest()加载TestCase到TestSuite中,用于少量的测试用例

#方法1.通过addTest()加载TestCase到TestSuite中,用于少量的测试用例
#创建测试套件
suite=unittest.TestSuite()
#给测试套件添加测试用例
#测试类类名+用例名字
suite.addTest(CountTest('test_add'))
suite.addTest(CountTest('test_names'))#执行测试套件 TextTestRunner
#创建执行器
runner=unittest.TextTestRunner()
#使用上面那个创建的执行器,执行测试套件
runner.run(suite)
#执行用例之后显示一个'.'代表通过一个测试用例

执行用例之后显示一个'.'代表通过一个测试用例

方法2:同时添加多个测试用例进入到套件之中

#addTests可以接受一个列表
suite=unittest.TestSuite()
cases=[CountTest('test_names'),CountTest('test_add')]
suite.addTests(cases)#生成执行器
runner=unittest.TextTestRunner()
runner.run(suite)

方法3:添加整个类的测试用例到套件中

suite=unittest.TestSuite()
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(CountTest))
#创建执行器
runner=unittest.TextTestRunner()
runner.run(suite)

方法四 模糊匹配 给套件指定需要执行的测试用例

#制定匹配规则,会自动生成测试套件,将用例添加进去
#加载路径
test_dir='../day07'
#名字不用写完,后面加上*
discover=unittest.defaultTestLoader.discover(start_dir=test_dir,pattern='Cou*.py')
#创建执行器
runner =unittest.TextTestRunner()# #执行测试用例
runner.run(discover)

五、跳过测试和预期失败

对原有代码进行修改,加上相应注释,如下:

未显示“加油加油”这条用例内容,说明成功跳过,再做修改:

结果同上

结果同上

六、测试报告的生成,使用HtmlTestRunner生成测试报告

HtmlTestRunner是一个用于生成HTML格式测试报告的工具,可以方便地将unittest测试结果可视化。以下是如何使用HtmlTestRunner生成测试报告的方法。

借助HtmlTestRunner来生成,下载下来是一个.py文件
方式一、将下载的文件保存到...\python\lib目录下,不推荐
方式二、创建一个包,将py文件放进去就行了

1.安装HtmlTestRunner.py

通过网盘分享的文件:HTMLTestRunner.py
链接: https://pan.baidu.com/s/137-UO-ZDesn_bO_2c1NhGA 提取码: pz5q

2.基本使用方法

以下是一个完整的示例代码,展示了如何生成测试报告:

import os
import unittest
from common.HTMLTestRunner import HTMLTestRunner
import timereport_path = './report'# 测试报告的标题
report_title = '冒烟测试'# 测试的描述
report_desc = "对加减法功能的测试"# 创建报告目录
if not os.path.exists(report_path):os.mkdir(report_path)# 构建时间戳作为报告文件名
rtime = time.strftime("%Y%m%d%H%M%S")
filepath = os.path.join(report_path, f'report{rtime}.html')# 发现测试用例
case_path = '../day07'
suite = unittest.defaultTestLoader.discover(start_dir=case_path, pattern="C*.py")# 使用HTMLTestRunner运行测试并生成报告
with open(filepath, "wb") as f1:runner = HTMLTestRunner(stream=f1,title=report_title,description=report_desc)runner.run(suite)  # 这里要使用HTMLTestRunner的run方法,不是TextTestRunner
生成后能在我们提前建好的包中找到:

点击即可选择浏览器打开:

3.自定义报告样式

HtmlTestRunner允许自定义报告的样式和内容:

runner = HTMLTestRunner(output=report_path,report_name='custom_report',add_timestamp=False,combine_reports=True
)
4.高级配置

可以在测试用例中添加更多信息来丰富报告内容:

class TestMath(unittest.TestCase):"""测试数学运算"""def test_addition(self):"""测试加法"""self.assertEqual(1 + 1, 2)def test_subtraction(self):"""测试减法"""self.assertEqual(3 - 1, 2)
5.注意事项
  • 确保测试用例的命名规范一致,便于discover方法查找
  • 报告路径需要有写入权限
  • 时间戳可以避免报告文件被覆盖
  • 测试用例中的docstring会显示在报告中

这种方法生成的HTML报告包含测试结果统计、详细测试步骤和错误信息,方便团队查看和分析测试结果。


http://www.hkcw.cn/article/GietsdYsUA.shtml

相关文章

断眉《歌手》将挑战单依纯或马嘉祺 网友票选对决对象

5月30日,湖南卫视歌手发布第二场揭榜赛制。微博网友可以从7位在线歌手中选择1位作为袭榜歌手查理普斯的对决对象。这7位在线歌手包括陈楚生、Mickey Guyton、GAI周延、白举纲、格瑞丝金斯勒、单依纯和马嘉祺。截止至当天17:00,推荐次数最高的歌手将作为守榜歌手,在节目中与袭…

罗家英第四次患癌 自曝剩9年寿命 乐观面对生命挑战

现年78岁的香港知名男星、老戏骨罗家英在接受媒体采访时透露,自己第四次确诊癌症,这次是前列腺癌。医生告诉他,还剩下9年寿命。有了前三次患癌的经历,罗家英对此表现得特别淡定。考虑到身体和年龄问题,罗家英拒绝接受化疗、电疗等治疗手段,选择顺其自然。他认为自己已经7…

断眉《歌手》合伙人是蒋一侨 音乐创作鬼才加盟

5月30日,湖南卫视《歌手》官方微博宣布查理普斯为袭榜歌手,他的音乐合伙人是蒋一侨。官博提到,查理普斯不仅才华横溢,现场演唱感染力十足,他将带来两首歌曲《Attention》和《See You Again》,但未透露他的袭榜对象。2024年5月31日晚,在《歌手2024》第四期的直播竞演中,…

【速通RAG实战:进阶】12、如何寻找大模型在企业业务中的价值?

一、大模型技术在企业级场景中的价值定位与核心维度 (一)技术价值演进:从效率工具到生产力革命 大模型(Large Language Model, LLM)与检索增强生成(Retrieval-Augmented Generation, RAG)技术的成熟,正推动企业数字化转型从「流程自动化」向「智能决策化」跃迁。根据…

Deepseek本次升级有多大提升 代码与文本能力显著增强

5月29日凌晨,DeepSeek-R1-0528正式在Hugging Face平台开源。此前一日,DeepSeek官方宣布DeepSeek-R1模型已完成小版本试升级,用户可通过官方网页、App、小程序进行测试,API接口和使用方式保持不变。此次更新中,模型代码能力的提升最为显著。知名代码测试平台LiveCodeBench显…

郑钦文vs姆博科 冲击16强硬仗

北京时间昨晚,法网女单第二轮较量中,中国球员郑钦文以6比2、6比3直落两盘击败哥伦比亚球员阿朗戈,连续第二年打进法网32强。接下来,郑钦文将面对世界排名120位的姆博科。尽管姆博科排名不高,但她的打法颇具冲击力。不久前,她在对阵世界前十球员巴多萨和高芙时表现出色,给…

主人讲述“中国狗王”的称霸之路 从山野猎手到国际网红

你见过不靠吼叫就能统治犬群的“狗王”吗?一只来自中国贵州山区的下司犬,最近在海外社交媒体上掀起风暴。它仅凭威严的姿态和沉静的眼神,就被外国网友封为“查尔斯国王”。这不禁让人思考:为何这只其貌不扬的中国土狗,能跨越语言和文化壁垒,成为全球网友追捧的“顶流”?…

信奥赛-刷题笔记-二分篇-T2-P1918保龄球0529

总题单 ​ 本部分总题单如下 【腾讯文档】副本-CSP-JSNOI 题单 (未完待续) https://docs.qq.com/sheet/DSmJuVXR4RUNVWWhW?tabBB08J2 二分篇题单 P1918 保龄球 https://www.luogu.com.cn/problem/P1918 题目描述 DL 算缘分算得很烦闷,所以常常到体育馆去打…

10年外卖员提醒一定要点堂食店:入口的东西千万不能马虎

近日,一消费者通过外卖平台购买的某品牌咖啡冰块中惊现完整苍蝇引发网友关注,随着天气逐渐炎热,外卖食品安全问题再次成为消费者关注的焦点。早在去年,央视就曾曝光的外卖平台“幽灵外卖”乱象,不少店铺不仅租借执照,甚至还和废品收购站开在一起,操作间的纱窗上结满了各…

佛山龙舟房东队称队员不都是房东 传承文化凝聚人心

去年端午节,广东佛山的沙步龙船队因队员黎国添的发言在网络上走红,被网友戏称为“房东队”。今年5月27日,有人现场观看了沙步龙船队的传统仪式“拜大廟”,并采访了黎国添本人。他不仅是沙步经济社社长,还是十几套房的房东以及光伏发电公司的老板。黎国添表示,虽然队里有房…

泡泡玛特客服回应黄牛门店扫货:界定存在难度

近日,有卖家在二手市场以8万价格打包转卖51个Labubu,款式均为绝版老款。随着Labubu系列潮流玩具爆火,部分隐藏款、绝版老款在二手市场的价格飙升至数万元。限量版、绝版Labubu二手市场价格飙升。图/二手交易平台截图Labubu是中国香港艺术家龙家升创作的北欧森林精灵形象,是…

上海成人吸烟率下降至18.6% 控烟成效显著

2025年5月30日是第38个“世界无烟日”,上海发布了最新的成人烟草流行调查核心数据。数据显示,上海成人吸烟率降至18.6%,为大陆地区省级最低。当天,以“拒绝烟草诱惑,对第一支烟说‘不’”为主题的宣传活动在上海虹口区举行。根据最新调查,上海成人吸烟率较2023年下降了0.…

友商谈小米YU7实车!

800万粉丝“说车的阿飞”,我记得这位博主还跟雷总一起直播过,人家亲自说明:“这次拍小米YU7,连八百块车马费都没有,就管了个中午的盒饭,几百个人都是纯邀请的,所以有一些媒体老师就会觉得小米不重视他,做内容自然会带着情绪做。”就像车圈那个梗,“800没有万”,导致行…

女子吃皮蛋口腔黏膜竟被灼伤 碱性过强惹的祸

近日,家住武昌区彭刘杨路的李女士吃了一口皮蛋后,口腔居然被灼伤了。口感清爽冰凉的皮蛋为何会灼伤口腔?端午节临近,李女士的友人送给她一盒包含粽子、咸蛋和皮蛋的礼盒。27日中午,李女士剥开一个皮蛋直接咬了一口,立刻感觉嘴里火辣辣的,像是针扎一样疼。她马上把嘴里的…

Linux系统网络管理

目录 一、网络参数配置 1、图形化配置 2、命令行配置 2.1、ifconfig命令 2.2、ifup和ifdown 2.3、ip a[ddress]命令 2.2、配置文件配置 3、路由配置 route命令 一、网络参数配置 1、图形化配置 systemctl start NetworkManager开启 systemctl stop NetworkManager关…

戴尔AI服务器订单激增至121亿美元 业务转型加速

戴尔科技最新财报显示,AI服务器需求的爆炸式增长正在重塑这家老牌PC制造商的业务格局,但也暴露出传统消费业务的疲软以及盈利能力的结构性挑战。周四美股盘后,戴尔公布了2026财年一季度财报,最引人注目的数据是121亿美元的AI服务器订单,这一数字不仅超过了公司整个2025财年…

8人因造谣某茶饮创始人被抓 AI谣言案告破

近日,上海警方成功侦破一起利用人工智能技术编造、传播网络谣言损害企业权益的案件,抓获姚某、陈某等8名犯罪嫌疑人。嫌疑人姚某是一名职业自媒体人,他花费800元在网上找到卢某代笔,利用AI生成了一篇关于沪上某茶饮企业的文章。未经核实,姚某便在十余个自媒体平台账号上发…

计算机组成原理第3章 存储器层次结构(竟成)

目录 第 3 章 存储器层次结构 3.1 存储器概述 3.1.1 存储器的分类 1.按存储介质分类 2.按存取方式分类 (1)随机存储器(Random Access Memory,RAM ) (2)只读存储器(Read - Only Memor…

贸促会:美工商界密集访华是用脚投票 开放合作成主旋律

5月30日,贸促会举行例行新闻发布会,新闻发言人赵萍出席并介绍了相关情况。会上,赵萍发布了3月全球经贸摩擦指数。数据显示,3月全球经贸摩擦指数为126,处于高位。全球经贸摩擦措施涉及金额同比上升26.1%,环比上升152.3%。监测范围内的20个国家(地区)中,美国和印度的全球…

运维方案,项目运维

1. 文档介绍 2. 人员与责任 3. 运维过程内容 4. 运维资源 5. 运维服务规划保障 6. 事件处置 7. 质量改进 8. 运维边界及内容 获取方式: 本文末个人名片直接获取。