最新要闻
- 环球播报:北京等多地天空疑现震撼的火箭夜光云:原理科普
- 年出货3亿只、逛店必买的一次性碱性电池:被宜家正式停售了
- 环球新资讯:抖音在世界杯上下的功夫 远不止撒币10亿买版权这么简单
- 差评如潮!《三体》动画评分暴跌至6.4:网友"口吐芬芳"
- 快讯:Epic与美国FTC和解:36.6亿元摆平两起官司
- 焦点关注:32开书本大小!华硕新款12代酷睿i7迷你机PC发布:零噪音
- 环球即时:内蒙古上空巨大发光体划破天际 网友:像手电筒一样
- 192个框框的怪兽!AMD Zen4线程撕裂者7000来了
- 马斯克现身世界杯观战阿根廷对法国:赛后发出灵魂拷问
- 【环球播资讯】梅西夺冠穿的黑纱是什么登上热搜:官方科普涨知识 意义非凡
- 今日快讯:小米13 Pro 8.38mm机身塞入太多强悍功能!雷军:相当不容易
- 当前快播:明年初亮相 全新东风标致408X即将发布:最美法系车来了
- 被裁员工报仇?近60%人赞成!马斯克将卸任推特CEO 没继承者还是我掌权
- 今日快讯:真值200+一张票价吗?《阿凡达2》用户评分:特效很棒 剧情稀烂
- 观察:小姐姐最爱!小米米家首款无线直板夹上架:30秒速热 369元
- AMD/Intel CES 2023新品发布会官宣:5大CPU齐飞
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
Python单元测试框架unittest
(资料图片)
1)写用例 TestCase
2)执行用例 1:TestSuite存储用例,2:TestLoader找用例,存储用例,存放指定的TestSuite
3)对比实际结果/期望结果,判定用例是否通过#断言Assert
4)出局测试报告TextTestRunner
1.测试类
import requestsclass HttpRequest(): def __init__(self, method, url, param=None, headers=None, cookie=None): self.method=method#method:请求方式 self.url=url#url:请求的url self.param=param#param:请求参数 self.headers=headers#headers:请求头 self.cookie=cookie#cookie:请求的cookie值 def http_request(self): if self.method.lower()=="post": return requests.post(self.url,self.param) elif self.method.lower()=="get": return requests.get(self.url,self.param,headers=self.headers,cookies=self.cookie) else: print("请求方式错误:{0}".format(self.method))
2.TestCase/断言/异常处理
import unittest#引入unittest框架from test01.qabujiaban_class import HttpRequest#引入测试类#编写一个存储测试用例的类class TestHttp(unittest.TestCase):#用例类继承unittest.TestCase用于编写测试用例 #正确登陆测试用例 def test_login_yes(self):#测试用例函数必须test_开头,否则框架无法识别当前是用例 login_url = "http://www.qabujiaban.com/user/login" data = {"username": "uuuu222都44", "password": "WJHasb124*1"} res = HttpRequest("Post", login_url, data).http_request() print("登陆响应文本:", res.json()) # try: self.assertEqual("0000", res.json()["code"]) # 断言,期望值==实际值 except AssertionError as e: print("断言错误异常抛出:{0}".format(e)) raise e#抛出异常 #错误登陆测试用例 def test_login_no(self): login_url = "http://www.qabujiaban.com/user/login" data = {"username": "uuuu222都44", "password": "123456"}#密码错误 res = HttpRequest("Post", login_url, data).http_request() print("登陆响应文本:", res.json()) # try: self.assertEqual("0000", res.json()["code"]) # 断言,期望值==实际值 except AssertionError as e: print("断言错误异常抛出:{0}".format(e)) raise e#抛出异常if __name__ == "__main__": unittest.main()#执行全部测试用例
执行结果:============================= test session starts =============================platform win32 -- Python 3.7.3, pytest-7.2.0, pluggy-1.0.0rootdir: C:\Users\Administrator\PycharmProjects\demo\test01plugins: html-3.2.0, metadata-2.0.4collected 2 itemstestdemo01.py [100%]============================== 2 passed in 0.35s ==============================Process finished with exit code 0.登陆响应文本: {"code": "0002", "message": "登陆失败,密码错误"}.登陆响应文本: {"code": "0000", "message": "登陆成功", "login_time": "2022-59-19 11:12:04", "create_time": "2021-23-28 04:12:19"}
注意:执行结果中,E表示错误,F表示失败, . 点表示成功
3.unittest.addTest()
import unittestfrom test01.demo_case import TestHttp#引入测试用例类suite = unittest.TestSuite()#存储器,存储用例#第一个用例suite.addTest(TestHttp("test_login_yes"))#添加要执行的用例#第二个用例suite.addTest(TestHttp("test_login_no"))runner = unittest.TextTestRunner()runner.run(suite)#执行
执行结果:.登陆响应文本: {"code": "0000", "message": "登陆成功", "login_time": "2022-12-20 12:12:33", "create_time": "2021-23-28 04:12:19"}登陆响应文本: {"code": "0002", "message": "登陆失败,密码错误"}.----------------------------------------------------------------------Ran 2 tests in 0.275sOKProcess finished with exit code 0
4.loader.loadTestsFromTestCase()
import unittestfrom test01.demo_case import TestHttp#引入测试用例类suite = unittest.TestSuite()#存储器,存储用例# #第一个用例# suite.addTest(TestHttp("test_login_yes"))#添加要执行的用例# #第二个用例# suite.addTest(TestHttp("test_login_no"))loader = unittest.TestLoader()#创建加载器suite.addTest(loader.loadTestsFromTestCase(TestHttp))#通过类名加载runner = unittest.TextTestRunner()runner.run(suite)#执行
执行结果:登陆响应文本: {"code": "0002", "message": "登陆失败,密码错误"}..登陆响应文本: {"code": "0000", "message": "登陆成功", "login_time": "2022-23-20 12:12:16", "create_time": "2021-23-28 04:12:19"}----------------------------------------------------------------------Ran 2 tests in 0.288sOKProcess finished with exit code 0
5.loader.loadTestFromModule()
import unittest# from test01.demo_case import TestHttp#引入测试用例类from test01 import demo_case#引入模块suite = unittest.TestSuite()#存储器,存储用例# #第一个用例# suite.addTest(TestHttp("test_login_yes"))#添加要执行的用例# #第二个用例# suite.addTest(TestHttp("test_login_no"))loader = unittest.TestLoader()#创建加载器# suite.addTest(loader.loadTestsFromTestCase(TestHttp))#通过类名加载suite.addTest(loader.loadTestsFromModule(demo_case))#通过类名加载runner = unittest.TextTestRunner()runner.run(suite)#执行
执行结果:.登陆响应文本: {"code": "0002", "message": "登陆失败,密码错误"}.----------------------------------------------------------------------Ran 2 tests in 0.259sOK登陆响应文本: {"code": "0000", "message": "登陆成功", "login_time": "2022-26-20 12:12:51", "create_time": "2021-23-28 04:12:19"}Process finished with exit code 0
6.TextTestRunner()
import unittest# from test01.demo_case import TestHttp#引入测试用例类from test01 import demo_casesuite = unittest.TestSuite()#存储器,存储用例# #第一个用例# suite.addTest(TestHttp("test_login_yes"))#添加要执行的用例# #第二个用例# suite.addTest(TestHttp("test_login_no"))loader = unittest.TestLoader()#创建加载器# suite.addTest(loader.loadTestsFromTestCase(TestHttp))#通过类名加载suite.addTest(loader.loadTestsFromModule(demo_case))#通过类名加载file = open(file="log.txt",mode="w",encoding="utf8")runner = unittest.TextTestRunner(stream=file,verbosity=2)#stream为日志存储路径,verbosity=0/1/2 打印日志的详细等级,2最详细runner.run(suite)#执行file.close()#关闭资源执行结果:
7.上下文管理器with open()
import unittest# from test01.demo_case import TestHttp#引入测试用例类from test01 import demo_casesuite = unittest.TestSuite()#存储器,存储用例# #第一个用例# suite.addTest(TestHttp("test_login_yes"))#添加要执行的用例# #第二个用例# suite.addTest(TestHttp("test_login_no"))loader = unittest.TestLoader()#创建加载器# suite.addTest(loader.loadTestsFromTestCase(TestHttp))#通过类名加载suite.addTest(loader.loadTestsFromModule(demo_case))#通过类名加载with open(file="log.txt",mode="w",encoding="utf8") as file:#执行完后自动关闭 runner = unittest.TextTestRunner(stream=file,verbosity=2)#stream为日志存储路径,verbosity=0/1/2 打印日志的详细等级,2最详细 runner.run(suite)#执行#print(file.closed)#判断状态,True=关闭
执行结果与open()一致
8.HTMLTestRunnerNew
import unittestimport HTMLTestRunnerNew#引入模板类# from test01.demo_case import TestHttp#引入测试用例类from test01 import demo_casesuite = unittest.TestSuite()#存储器,存储用例loader = unittest.TestLoader()#创建加载器suite.addTest(loader.loadTestsFromModule(demo_case))#通过类名加载with open(file="qabujiaban_report.html",mode="wb") as file:#执行完后自动关闭 runner = HTMLTestRunnerNew.HTMLTestRunner(stream=file, verbosity=2,title="这里是标题",description="这里写描述",tester="这里写谁测试的") runner.run(suite)生成报告:
9.setUp()&tearDown()
import unittest#引入unittest框架from test01.qabujiaban_class import HttpRequest#引入测试类#编写一个存储测试用例的类class TestHttp(unittest.TestCase):#用例类继承unittest.TestCase用于编写测试用例 def setUp(self) -> None: print("每一条用例执行前执行...") def tearDown(self) -> None: print("每一条用例执行结束后执行...(一般放到用例之后)") #正确登陆测试用例 def test_login_yes(self):#测试用例函数必须test_开头,否则框架无法识别当前是用例 print("执行用例11111111111111111") def test_login_no(self): print("执行用例22222222222222222")if __name__ == "__main__": unittest.main()#执行全部测试用例执行结果:
============================= test session starts =============================platform win32 -- Python 3.7.3, pytest-7.2.0, pluggy-1.0.0plugins: html-3.2.0, metadata-2.0.4collected 2 itemsdemo_case.py .每一条用例执行前执行...执行用例22222222222222222每一条用例执行结束后执行...(一般放到用例之后).每一条用例执行前执行...执行用例11111111111111111每一条用例执行结束后执行...(一般放到用例之后) [100%]============================== 2 passed in 0.10s ==============================Process finished with exit code 0
Python单元测试框架unittest
环球播报:北京等多地天空疑现震撼的火箭夜光云:原理科普
年出货3亿只、逛店必买的一次性碱性电池:被宜家正式停售了
环球新资讯:抖音在世界杯上下的功夫 远不止撒币10亿买版权这么简单
差评如潮!《三体》动画评分暴跌至6.4:网友"口吐芬芳"
快讯:Epic与美国FTC和解:36.6亿元摆平两起官司
Spring IOC官方文档学习笔记(二)之Bean概述
焦点观察:FreeSWITCH学习笔记:通道变量
焦点关注:32开书本大小!华硕新款12代酷睿i7迷你机PC发布:零噪音
环球即时:内蒙古上空巨大发光体划破天际 网友:像手电筒一样
192个框框的怪兽!AMD Zen4线程撕裂者7000来了
世界快报:Django框架:9、Ajax简介、基本语法、数据编码格式、携带文件数据
马斯克现身世界杯观战阿根廷对法国:赛后发出灵魂拷问
【环球播资讯】梅西夺冠穿的黑纱是什么登上热搜:官方科普涨知识 意义非凡
今日快讯:小米13 Pro 8.38mm机身塞入太多强悍功能!雷军:相当不容易
当前快播:明年初亮相 全新东风标致408X即将发布:最美法系车来了
被裁员工报仇?近60%人赞成!马斯克将卸任推特CEO 没继承者还是我掌权
今日快讯:真值200+一张票价吗?《阿凡达2》用户评分:特效很棒 剧情稀烂
观察:小姐姐最爱!小米米家首款无线直板夹上架:30秒速热 369元
环球速看:Java关键词final解读
环球视点!简单排序
全球观焦点:数据结构与算法概念
AMD/Intel CES 2023新品发布会官宣:5大CPU齐飞
《阿凡达2:水之道》若大卖 《阿丽塔:战斗天使》续作可能有戏了!
OPPO首款竖向折叠屏Find N2 Flip评测:电池不再是遗憾 媲美传统直板手机
【环球播资讯】你能接受么?微软计划推出更廉价XGP:广告是代价
确认了!小米13系列没有砍掉Wi-Fi 7:将择机打开功能
安装VScode
linux设备树实现多个中断父(interrupt-parent)节点
当前观点:阿根廷夺冠 花16万现场看世界杯决赛的男子哭着说值了
热文:家长注意!2岁男童将硬币塞进电动车充电口 手被炸黑
天天最新:手工耿自制钓鱼佬智能快乐竿:外形酷似大狙 上钩主动提醒
当前头条:【活动预告】网易数帆首场低代码线上沙龙即将开启,报名从速!
全球头条:美国核聚变重要突破 “人造太阳”10年后有望实现发电 我国企业呢?
天天报道:联想USB 3.0扩展坞仅29元:4个USB接口 支持Type-C供电
环球滚动:颠覆认知的研究!人类可能在树上就学会了直立行走
天天快资讯:温和洁肤 六神茗茶植萃沐浴露:25.9元买一送一
满满维生素 乐源100%纯果汁大促:到手每瓶3块钱
全球头条:java中的代码块
天天观点:大数据 - DWD&DIM 业务数据
环球热点!springboot通过Referer防止跨站点请求伪造
天天微动态丨Tarjan算法求割点
最新快讯!腾讯游戏AI能帮医生看片了:超大尺寸扫描病理图像诊断成功验证
【天天报资讯】号称可以火星上穿的衣服全网首开:胸前一个大洞 自带呕吐袋
环球讯息:管好右手 摩托车弯道狂飙超车撞上护栏:骑手生死未卜
【全球聚看点】2022第三季度耳机手环出货量都跌了!因为苹果 手表逆势增长
国产龙鳞甲电池2023年装车量产:续航可达1000公里 安全没问题
环球最新:零基础入门 Java 后端开发,有哪些值得看的视频?
NVIDIA CES新品发布会官宣:RTX 4070 Ti、RTX 40笔记本显卡要来了
当前关注:美国侧目:俄罗斯生产首颗百分百国产通信卫星
观点:226MB你用吗?微信键盘正式版上线 张小龙:更好保护用户隐私
快报:新的全球制造中心越南、印度正崛起:想取代我们为时尚早
环球微资讯!30万级美系大SUV 福特探险者混动版曝光:电池来自比亚迪
天天热资讯!SIT-board 远程交互式白板的实现
洛谷 P6580 [Ynoi 2019] 美好的每一天~ 不连续的存在 题解
热头条丨火山引擎 DataTester 科普:A/B 实验常见名词解释
世界报道:Shell 变量知多少?
全球今头条!在Windows Linux中 安装 anaconda
讯息:无线投屏(智慧教室)
天天看热讯:二分的边界问题
Controller 层代码就该这么写,简洁又优雅!
SAP根据excel表格数据将数据导入表中
全球快看:JS中的相等性判断
半夜是指什么时间?半夜是指什么生肖?
三浴是什么意思?三浴锻炼是指哪三浴?
45号钢抗拉强度极限是多少?45号钢抗拉强度极限一览
今日看点:Redis——01 学习
每日看点!基于 Dubbo Admin 临时踢除问题服务实例
教材是什么意思?教材的作用有哪些?
受权人是什么意思?被授权人与受权人的区别是什么?
春风十里不如你结局是什么?春风十里不如你演员表
什么是环保型材料?环保型材料有哪些?
美团外卖超时怎么赔付?美团外卖超时了骑手会扣钱吗?
市政协委员相当于什么官?市政协委员有什么用?
顺丰速运公众号怎么修改手机号?顺丰速运公众号运费支付在哪里?
每日资讯:【算法训练营day22】LeetCode235. 二叉搜索树的最近公共祖先 LeetCode701. 二叉搜索树中的插入操作 LeetCode450.
【全球新视野】教你用JavaScript实现表情评级
环球要闻:基于 Dubbo Admin 动态调整服务超时时间
每日报道:JNPF实操│来,一起体验一流程多表单到底有多便捷
环球看点!DOM 之 Node和Element的区别
用户认为4G够用?全国5G现状感受下:基站密度翻倍 后续你不得不升
天天实时:《阿凡达2》内地首周末报收3.96亿 表现不佳:预测票房缩水至10亿!
天天热点!加冕球王夺冠后 梅西宣布不会退出国家队:继续以世界杯冠军身份出战
当前视讯!是否辞去推特总裁?马斯克发公开投票:目前情况不妙
全球看热讯:你达标了吗?我国成年人均纸质书阅读4.76本 仅小学生的1/3
【环球时快讯】原生JS的节点操作 与 JQuey的节点操作 对比
天天信息:MyBatis实现增删改查
今晚执行!国内成品油价将迎三连跌:今年国内油价最后一调
小米13 Pro为何不用直屏?雷军解释原因
睡不好为何昏昏沉沉?大脑:怪我咯
圆梦卡塔尔球迷狂祝福!阿根廷夺世界杯冠军:梅西再拿金球奖、点球破门创纪录
苹果新一代显示器来了:屏幕升级为mini LED
直接用CPU主频判断性能 靠谱吗?
环球速看:你的MacBook Pro蝶式键盘可安好?苹果翻车了 赔偿了事
全球微速讯:Axios异步通信
今日热文:第一百一十五篇: JS集合引用类型Map
AMD Zen4锐龙三款新U终于敲定:价格已毫无优势!
快看:一个躁郁症的游戏:我想推荐给每一个玩家
今日报丨2.23亿度!三峡能源单日发电量创纪录
即时看!教你轻松用上ChatGPT