python中unittest框架应用详解
作者:小木可菜鸟测试一枚 发布时间:2023-05-26 14:27:42
标签:python,unittest,框架
目录
1、Unittest为Python内嵌的测试框架,不需要特殊配置
2、编写规范
总结
1、Unittest为Python内嵌的测试框架,不需要特殊配置
2、编写规范
需要导入 import unittest
测试类必须继承unittest.TestCase
测试方法以 test_开头
模块和类名没有要求
TestCase
理解为写测试用例
TestSuite
理解为测试用例的集合
TestLoader
理解为的测试用例加载
TestRunner
执行测试用例,并输出报告
import unittest
from class_api_login_topup.demo import http_request
from class_api_login_topup.http_attr import Get_Attr # 反射的值 获取 cookies
# 这是文件http_attr中的Get_Attr类
class Get_Attr:
cookies = None
class Login_Http(unittest.TestCase):
def __init__(self, methodName, url, data, method, expected):
super(Login_Http, self).__init__(methodName) # 超继承
self.url = url
self.data = data
self.expected = expected
self.method = method
def test_api(self): # 正常登录
res = http_request().request(self.url, self.data, self.method, getattr(Get_Attr, 'cookies'))
if res.cookies:
setattr(Get_Attr, 'cookies', res.cookies)
try:
self.assertEqual(self.expected, res.json()['code'])
except AssertionError as e:
print("test_api's, error is {0}", format(e))
raise e
print(res.json())
if __name__ == '__main__':
unittest.main()
执行一:
import unittest
from class_demo_login_topup.http_tools import Login_Http
suite = unittest.TestSuite()
loader = unittest.TestLoader()
test_data = [{'url': 'http://test.lemonban.com/futureloan/mvc/api/member/login',
'data': {'mobilephone': 'xxxx', 'pwd': '123456'}, 'expected': '10001', 'method': 'get'},
{'url': 'http://test.lemonban.com/futureloan/mvc/api/member/login',
'data': {'mobilephone': 'xxxx', 'pwd': '12345678'}, 'expected': '20111', 'method': 'get'},
{'url': 'http://test.lemonban.com/futureloan/mvc/api/member/recharge',
'data': {'mobilephone': 'xxxx', 'amount': '1000'}, 'expected': '10001', 'method': 'post'},
{'url': 'http://test.lemonban.com/futureloan/mvc/api/member/recharge',
'data': {'mobilephone': 'xxxx', 'amount': '-100'}, 'expected': '20117', 'method': 'post'}]
# 遍历数据,执行脚本 addTest 单个执行
for item in test_data:
suite.addTest(Login_Http('test_api', item['url'], item['data'], item['method'], item['expected']))
# 执行
with open('http_TestCase.txt', 'w+', encoding='UTF-8') as file:
runner = unittest.TextTestRunner(stream=file, verbosity=2)
runner.run(suite)
# 运行结果
{'status': 1, 'code': '10001', 'data': None, 'msg': '登录成功'}
{'status': 0, 'code': '20111', 'data': None, 'msg': '用户名或密码错误'}
{'status': 1, 'code': '10001', 'data': {'id': 10011655, 'regname': '小蜜蜂', 'pwd': 'E10ADC3949BA59ABBE56E057F20F883E', 'mobilephone': 'xxxx', 'leaveamount': '150000.00', 'type': '1', 'regtime': '2021-07-14 14:54:08.0'}, 'msg': '充值成功'}
{'status': 0, 'code': '20117', 'data': None, 'msg': '请输入范围在0到50万之间的正数金额'}
执行二:把test_data的数据放在EXCEL中运行。
import unittest
from class_demo_login_topup.http_tools import Login_Http
suite = unittest.TestSuite()
loader = unittest.TestLoader()
test_data = HttpExcel('test_api.xlsx', 'python').real_excel()
for item in test_data:
suite.addTest(Login_Http('test_api', item['url'], eval(item['data']), item['method'], str(item['expected'])))
with open('http_TestCase.txt', 'w+', encoding='UTF-8') as file:
runner = unittest.TextTestRunner(stream=file, verbosity=2)
runner.run(suite)
执行三、直接用装饰器ddt
import unittest
from class_api_login_topup.demo import http_request
from class_api_login_topup.http_attr import Get_Attr # 反射的值
from ddt import ddt, data, unpack
from class_demo_login_topup.http_excel import HttpExcel
test_data = HttpExcel('test_api.xlsx', 'python').real_excel()
@ddt
class Login_Http(unittest.TestCase):
@data(*test_data)
def test_api(self, item): # 正常登录
res = http_request().request(item['url'], eval(item['data']), item['method'], getattr(Get_Attr, 'cookies'))
if res.cookies:
setattr(Get_Attr, 'cookies', res.cookies)
try:
self.assertEqual(str(item['expected']), res.json()['code'])
except AssertionError as e:
print("test_api's, error is {0}", format(e))
raise e
print(res.json())
执行ddt方式一
import unittest
from class_demo_login_topup.http_tools import Login_Http
from class_demo_login_topup.http_excel import HttpExcel
suite = unittest.TestSuite()
loader = unittest.TestLoader()
from class_demo_login_topup import http_tools_1
suite.addTest(loader.loadTestsFromModule(http_tools_1)) # 执行整个文件
with open('http_TestCase.txt', 'w+', encoding='UTF-8') as file:
runner = unittest.TextTestRunner(stream=file, verbosity=2)
runner.run(suite)
执行ddt方式二
import unittest
from class_demo_login_topup.http_tools import Login_Http # 不用ddt的方法
from class_demo_login_topup.http_excel import HttpExcel
suite = unittest.TestSuite()
loader = unittest.TestLoader()
from class_demo_login_topup.http_tools_1 import * # http_tools_1文件是用ddt的方法
suite.addTest(loader.loadTestsFromTestCase(Login_Http)) # 执行http_tools_1 文件下的Login_Http类,按照类执行
with open('http_TestCase.txt', 'w+', encoding='UTF-8') as file:
runner = unittest.TextTestRunner(stream=file, verbosity=2)
runner.run(suite)
来源:https://blog.csdn.net/m0_51709670/article/details/120335995
0
投稿
猜你喜欢
- 在编程中我们往往会希望能够实现这样的操作:点击Button,选择了图片,然后在窗口中的Label处显示选到的图片。那么这时候就需要如下代码:
- 开发工具**Python版本:**3.6.4相关模块:scikit-learn模块;jieba模块;numpy模块;以及一些Python自带
- 前言网上经常能看到一些文章总结在 mysql 中不能命中索引的各种情况,其中有一种说法就是指使用了 or 的语句都不能命中索引。这种说法其实
- python程序运行中,可由程序抛出异常。异常触发:使用raise命令抛出异常,即可使用异常基类Exception,也可使用自定义异常类(继
- 本文实例为大家分享了PyQt5实现简易计算器的具体代码,供大家参考,具体内容如下效果图: 界面代码calc_interface.py# -*
- 前言可能很多人会觉得这是一个奇葩的需求,爬虫去好好的爬数据不就行了,解析js干嘛?吃饱了撑的?搜索一下互联网上关于这个问题还真不少,但是大多
- 简介显示大量已经按类别(不是很多)排序的数据但没有类别分界线,用户很难找到所需要的类别。例如,数据库中只有9个类别(8个不同的类别和1个nu
- 本文实例讲述了python+Django+apache的配置方法。分享给大家供大家参考,具体如下:下载安装xampp套件下载mod_pyth
- 1. 使用.logfile 方法#!/usr/bin/env pythonimport pexpectimport syshost=&quo
- 1-删除模型变量del model_define2-清空CUDA cachetorch.cuda.empty_cache()3-步骤2(异步
- 算术运算符对数值类型的变量及常量进行算数运算。也是最简单和最常用的运算符号。四则混合运算,遵循 “先乘除后加减&
- pom.xml文件中引入如下内容<dependency><groupId>com.github.ulisesbocc
- 随着深度学习的发展,在大模型的训练上都是在一
- 可以加上时间判断,让程序在固定的时间启动。#coding=utf-8#!/usr/bin/pythonimport osdef open_a
- pytorch显存越来越多的一个原因optimizer.zero_grad()loss.backward()optimizer.step()
- #!/usr/bin/perl -wuse strict;use warnings;use FileHandle;my %fh;my @ar
- 有时需要根据项目的实际需求向spider传递参数以控制spider的行为,比如说,根据用户提交的url来控制spider爬取的网站。在这种情
- 前言kylin是一个开源的OLAP分析引擎,具有亚秒级查询大表的能力通过kylin提供的cube预构建功能,省去了不断写sql查询hive的
- 学了一天pygame,用python和pygame写一个简单的挡板弹球游戏GitHub:EasyBaffleBallGame# -*- co
- 我就废话不多说了,大家还是直接看代码吧~package mainimport ("encoding/json""