Python接口自动化测试之Requests库Pytest框架

news2025/7/14 8:51:09
  1. 发送get请求

#导包
import requests
#定义一个url
url = "http://xxxxxxx"
#传递参数
payload="{\"head\":{\"accessToken\":\"\",\"lastnotice\":0,\"msgid\":\"\"},\"body\":{\"user_name\":\"super_admin\",\"password\":\"b50c34503a97e7d0d44c38f72d2e91ad\",\"role_type\":1}}"
headers = {
  'Content-Type': 'text/plain',
  'Cookie': 'akpsysessionid=bafc0ad457d5a99f3a4e53a1d4b32519'
}
#发送get请求
r = requests.get( url=url,headers=headers, data=payload)
#打印结果
print(r.text)
#解码
print(r.encoding)
print(r.text.encode('utf-8').decode('unicode_escape'))#先把返回的结果转换成utf-8,再去解码成中文的编码
  1. 发送post请求

#导包
import requests
#定义一个url
url = "http://xxxxxxx"
#传递参数
payload="{\"head\":{\"accessToken\":\"\",\"lastnotice\":0,\"msgid\":\"\"},\"body\":{\"user_name\":\"super_admin\",\"password\":\"b50c34503a97e7d0d44c38f72d2e91ad\",\"role_type\":1}}"
headers = {
 'Content-Type': 'text/plain',
 'Cookie': 'akpsysessionid=bafc0ad457d5a99f3a4e53a1d4b32519'
}
#发送post请求
r = requests.post( url=url,headers=headers, data=payload)
#打印结果
print(r.text)
  1. 发送https请求

import requests
url='https://www.ctrip.com/'
#第一种解决方案,发送请求的时候忽略证书,证书的参数verify用的比较多
r=requests.post(url=url,verify=False)#verify参数默认为True,值为False,表示忽略证书
#第二张解决方案,verify里面添加证书的路径
r=requests.post(url=url,verify='证书的路径')#verify参数默认为True,值为False,表示忽略证书
print(r.text)
  1. 文件上传

import requests
file = {
    'filename':open('文件名称','rb')
}
response = requests.post("网址",file)
print(response.text)
  1. 文件下载

#小文件下载
import requests
r = requests.get("https://img.sitven.cn/Tencent_blog_detail.jpg")
with open(r"D:\a.jpg", "wb") as f:
    f.write(r.content)

#大文件下载
import requests
def test_downloads(url, file):
    s = requests.session()
    r = s.get(url, stream=True, verify=False)
    with open(file, "wb") as f:
        for chunk in r.iter_content(chunk_size=512):
            f.write(chunk) 
if __name__ == "__main__":
    url = "https://www.url.com/test/export"
    file = "D:\\a.xlsx"
    test_downloads(url=url, file=file)
#转载至:https://blog.csdn.net/weixin_43507959/article/details/107326912
  1. timeout超时

#导包
import requests
#循环10次
for i in range(0,10):
    try:
        url="http://xxxxxxxxxxxxxxxx"
        data={
            "head":{"lastnotice":0,"msgid":"","accessToken":"89a08bff-15d7-4d7a-9967-0b5f4fb699ce"},
            "body":{"clinicid":"978f661e-1782-43bd-8675-b0ff1138ab7c","deptid":"09b8515b-b01b-4771-9356-aed6b5aa01bf","doctorid":"65ac0251-10ff-473a-af8a-20e8969176f7","registtype":0,"card_num":"","bcc334":"","patientopt":1,"bkc368":"1","patient":{"cardid":"","medicalcardid":"","label":"","sourcetype":1,"nationid":"01","maritalstatus":0,"address":"","company":"","jobname":"","email":"","remark":"","bcc334":"","name":"11","gender":1,"phone":"","birthdate":"2020-03-23","patienttype":1,"szsbcardid":""}}
        }
#发送post请求,超时时间0.03s
        r=requests.post(url=url,json=data,timeout=0.03)
        print(r.text)
        print(r.cookies)
    except:
        print('error')
#可参考:https://blog.csdn.net/weixin_44350337/article/details/99655387
  1. 鉴权

7.1 auth参数鉴权

import requests
url = 'http://192.168.1.1'
headers = {} # 有的不带头也能请求到 不带头可以忽略这行 和headers=headers,这两处
r = requests.get(url, auth=('admin', '123456'), headers=headers, timeout=10)
print(r.text)

7.2 session操作

#实例化session
session = requests.session()
#使用session发起请求
response = session.post(url,headers=req_header,data=form_data)

7.3 token操作

import requests
url="http://xxxxxxxxxxxxxxx"

json={
    "head":{"accessToken":"","lastnotice":0,"msgid":""},
    "body":{"username":"15623720880","password":"48028d2558577c526a017883211b4066","forceLogin":0}
}
r=requests.post(url=url,json=json)
print(r.text)
print(r.cookies)

#登录成功后返回token,带入下一个接口
for i in range(0,1):
    try:
        url="xxxxxxxxxxxxxxxxxx"
        data={
            "head":{"lastnotice":0,"msgid":"","accessToken":"89a08bff-15d7-4d7a-9967-0b5f4fb699ce"},
            "body":{"clinicid":"978f661e-1782-43bd-8675-b0ff1138ab7c","deptid":"09b8515b-b01b-4771-9356-aed6b5aa01bf","doctorid":"65ac0251-10ff-473a-af8a-20e8969176f7","registtype":0,"card_num":"","bcc334":"","patientopt":1,"bkc368":"1","patient":{"cardid":"","medicalcardid":"","label":"","sourcetype":1,"nationid":"01","maritalstatus":0,"address":"","company":"","jobname":"","email":"","remark":"","bcc334":"","name":"11","gender":1,"phone":"","birthdate":"2020-03-23","patienttype":1,"szsbcardid":""}}
        }
        r=requests.post(url=url,json=data,timeout=0.09)
        print(r.text)
        print(r.cookies)
    except:
        print('error')

7.4 sign签名

# appid:wxd930ea5d5a258f4f
# mch_id:10000100
# device_info:1000
# body:test
# nonce_str:ibuaiVcKdpRxkhJA
import hashlib
#需要加密的字符串
stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
#构建一个对象为md
md=hashlib.md5()
#对stringA字符串进行编码
md.update(stringA.encode()) 
#生成后的加密值
AES=md.hexdigest()
#把加密的结果,小写转大写 upper函数
AES=AES.upper()
print(AES)
参考微信支付:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
  1. 自动化模块划分

config 配置文件(python package)#directory和python package大同小异
common 公共的方法(python package)
testdata 测试数据(python package)
test_case测试用例(python package)
report 报告(directory)
run_case 测试执行(python package)
log 日志

8.1 config配置文件

def server_ip():
    '''
    ait_ip=''开发环境的服务器ip
    sit_ip=''测试环境的服务器ip
    :return: 返回不同服务器的地址
    '''


    server_add={
        'dev_ip' : 'http://his.xxxxxxxxxxx.com',
        'sit_ip' : 'http://his.xxxxxxxxxxxx.comm'
    }
    return server_add['dev_ip']
------------------------------------------------------------------------------------
def sql_conf():
    '''
    host数据库ip
    user数据库用户名
    password数据库密码
    database:连接数据库名
    port数据库端口
    chrset数据库字符集 中文utf-8
    :return:
    '''
    host='localhost'
    user='root'
    password='123456'
    database='mysql'
    port=3306
    charset='utf8' #这用utf8,utf-8会报错
    return host,user,password,database,port,charset

8.2 common 公共的方法

# 封装一个读取Excel表格数据的函数
# 对Excel表格数据的读取需要用到一个库——xlrd库
import xlrd
def get_excel_value(i):
    '''
    读取表中一行的数据
    :return:返回2,3行数据
    '''
    filename = r"../testdata/jiekou.xls" #文件要用相对路径
    book = xlrd.open_workbook(filename)  # 打开一个工作薄,不需要手动进行关闭
    # sheet = book.sheet_by_name("Sheet1") 根据工作表的名字,获取一个工作表对象
    sheet = book.sheet_by_index(0)  # 获取一个工作表,以index的方式,这里是获取第1个工作表
    return sheet.cell_value(i,1),sheet.cell_value(i,2)
# print(sheet.nrows) #打印所有行
# print(sheet.ncols) #打印所有列
# print(sheet.row_values(0))  #打印第一行
# print(sheet.col_values(0))  #打印第一列
# print(sheet.cell_value(0,1)) #打印第一行,第二列
# for i in range(1, sheet.nrows):

    # print(sheet.cell_value(i,1),sheet.cell_value(i,2))# 打印单元格[所有数据]的值
    # str='(sheet.cell_value(i,1),sheet.cell_value(i,2)))'
    # print(str)
# for i in range(1, sheet.nrows):
#     # for j in range(0, sheet.ncols):
#         print(sheet.cell_value(i,j)) # 打印单元格[i,j]的值
---------------------------------------------------------------------------------------------
import pymysql
from config.sql_conf import *
def get_sql(sql):
    '''
    :param sql:运行查询的sql语句
    :return:数据库查询结果
    '''
    #建立一个连接对象
    host, user, password, database, port, charset=sql_conf()
    db=pymysql.connect(host=host,user=user,password=password,database=database,port=port,charset=charset)
    #建立一个游标
    cursor=db.cursor()
    #执行sql语句
    cursor.execute(sql)
    #把sql运行的数据保存在data变量里面
    data=cursor.fetchall() #获取查询出的所有的值
    cursor.close() #关闭游标
    db.close() #关闭数据库连接
    return data
# print(get_sql("SELECT help_topic_id FROM help_topic WHERE Name='MOD'")) #执行sql语句
# print(type(get_sql("SELECT help_topic_id FROM help_topic WHERE Name='MOD'")))

8.3 testdata 测试数据

主要存放xls,txt,csv测试数据

8.4 test_case测试用例

from common.get_mysql import get_sql
from config.cof import server_ip
from common.get_excel import *
from config.sql_conf import *
import requests
# user_id=get_sql("SELECT help_topic_id FROM help_topic WHERE Name='MOD'")#提取数据库数据
# print(user_id)#打印结果
# assert get_sql("SELECT help_topic_id FROM help_topic WHERE Name='MOD'")#断言数据库的数据是否存在

def test_aokao_login():
     url=server_ip()+'/service/user/login'
     username,password=get_excel_value(1) #读取文件第二行数据
     json={
          "head":{"accessToken":"","lastnotice":0,"msgid":""},
          "body":{"username":username,"password":password,"forceLogin":0}
     }

     # usernamepassword=get_excel_value(4)[0] #读取文件第二行数据
     # print(type(usernamepassword))
     # #把str类型转为字典格式 eval 函数
     # json=eval(usernamepassword)
     r=requests.post(url=url,json=json)
     print(r.text)
     assert r.status_code==200 #断言状态码是否等于200
     assert '"accessToken":"89a08bff-15d7-4d7a-9967-0b5f4fb699ce",' in r.text #断言返回信息是否包含accesstoken

def test_aokao_registadd():
     url = server_ip()+'/service/registration/registadd'
     data = {
          "head": {"lastnotice": 0, "msgid": "", "accessToken": "89a08bff-15d7-4d7a-9967-0b5f4fb699ce"},
          "body": {"clinicid": "978f661e-1782-43bd-8675-b0ff1138ab7c", "deptid": "09b8515b-b01b-4771-9356-aed6b5aa01bf",
                   "doctorid": "65ac0251-10ff-473a-af8a-20e8969176f7", "registtype": 0, "card_num": "", "bcc334": "",
                   "patientopt": 1, "bkc368": "1",
                   "patient": {"cardid": "", "medicalcardid": "", "label": "", "sourcetype": 1, "nationid": "01",
                               "maritalstatus": 0, "address": "", "company": "", "jobname": "", "email": "",
                               "remark": "", "bcc334": "", "name": "11", "gender": 1, "phone": "",
                               "birthdate": "2020-03-23", "patienttype": 1, "szsbcardid": ""}}
     }

     r = requests.post(url=url, json=data, timeout=0.09)
     print(r.text)
     print(r.cookies)
     assert r.status_code == 200  # 断言状态码是否等于200

8.5 report 报告

主要存放html,xml报告

8.6 run_case 测试执行

import pytest

'''
测试文件以test_开头,(以—_test结尾也可以)
测试类以Test开头,并且不能带有init 方法
测试函数以test_开头
断言使用基本的assert即可
'''
#如何去运行测试用例,_test开头的函数就可以,判断用例运行是否成功,assert断言
if __name__=="__main__":
    #单个文件运行,运行添加,对应的文件路径,路径要用相对路径
    # pytest.main(['../test_case//test_case_01.py'])
    #多个文件运行,运行添加多个对应的文件路径,列表的形式,去添加多个文件的路径
    # pytest.main(['../test_case/test_fore.py','../test_case/Dynamic correlation_token.py'])
    #运行整个目录,添加目录的路径
    pytest.main(['../test_case/','--html=../report/report.html','--junitxml=../report/report.xml'])

'''
pytest生成报告:
1、生成html报告
'--html=../report/report.html'
2、生成xml报告
'--junitxml=../report/report.xml'
'''

end


Python接口自动化测试零基础入门到精通(2023最新版)

 

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

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

相关文章

C#简单晶圆wafermapping显示示范demo

点击,双击可改变颜色 预设5行8列数据: using (fratte.at.WafermapDisplay.Form1 form_show new fratte.at.WafermapDisplay.Form1()){int[,] data_demo new int[,]{{ 0,0,0,1,0 },{ 0,5,1,0,0 },{ 1,7,6,2,3 },{ 1,0,1,2,3 },{ 0,2,0,2,3 }, { 1,5,6,…

SpringCloud: feign整合sentinel实现降级

一、加依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache…

软件测试用例设计方法-因果图法

边界值法是等价类划分法的补充&#xff0c;所以&#xff0c;它们是一对搭档。 那么&#xff0c;判定表法有没有它的搭档呢&#xff1f; 答案是&#xff0c;有的。那就是本篇文章分享的用例设计方法—— 因果图法 。 定义 因果图法&#xff1a; 用来处理等价类划分和边界值考…

基于YOLOv8模型的老虎目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型的老虎目标检测系统可用于日常生活中检测与定位老虎目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集…

postgresql中uuid的使用

1.安装扩展插件 create extension "pgcrypto"; 2.查询uuid #36位uuid select gen_random_uuid();#去除斜杠 select REPLACE(gen_random_uuid()::text, -, ) 3.uuid在字段默认值上的使用 注:在函数前,需要加上模式名称

6.SNMP报错-Error opening specified endpoint “udp6:[::1]:161“处理

启动SNMP服务 /etc/init.d/snmpd start 出现以下报错信息 [....] Starting snmpd (via systemctl): snmpd.serviceJob for snmpd.service failed because the control process exited with error code. See "systemctl status snmpd.service" and "journalctl…

树控件的使用

目录 1、修改树控件的基础属性&#xff1a; 2、准备图标 &#xff1a; &#xff08;1&#xff09;、ico后缀的图片放入当前文件路径的rc中 &#xff08;2&#xff09;、在Icon中添加资源&#xff0c;导入图片 &#xff08;3&#xff09;、准备HICON图标 &#xff08;4&am…

牛客:FZ113 牛群的配对

FZ113 牛群的配对 文章目录 FZ113 牛群的配对题目描述题解思路题解代码 题目描述 题解思路 倒序遍历字符串&#xff0c;若当前字符是d且前一个字符是c&#xff0c;或者当前字符是b且前一个字符是a则在字符串中消除这两个字符&#xff0c;直到字符串便遍历完毕&#xff0c;若字…

prometheus获取kubelet接口监控数据

一、前言 k8s集群的kubelet服务内部有自带的cadvisor服务用于收集k8s集群的监控数据&#xff0c;所以可以通过调用kubelet的接口就能获取pod的资源监控数据&#xff0c;在新版本的k8s中&#xff0c;kubelet的监控数据获取端口为10250端口&#xff0c;老版本的是10255端口 二、…

web前端基础训练-----创建用户反馈表单

1&#xff0c;实验代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>用户反馈表单</title></head><body><form><fieldset><h1>用户反馈</h1><hr/><h4>亲爱的用…

tortoise 快捷操作分支合并

请大佬来看看有没有问题&#xff1f;&#xff0c;补充一下 1.创建新分支&#xff1a;bbb 2.在分支中修改我需要的功能 3.提交&#xff0c;本地代码&#xff0c;分支可推送&#xff0c;也可不推送到远端 4. 切换到需要合并的目标分支master&#xff0c;然后点击分支合并&#x…

Java并发面试题:(四)synchronized和lock区别

synchronized 关键字 synchronized关键字解决的是多个线程之间访问资源的同步性&#xff0c;synchronized关键字可以保证被它 修饰的方法或者代码块在任意时刻只能有一个线程执行。 另外&#xff0c;在 Java 早期版本中&#xff0c; synchronized属于重量级锁&#xff0c;效率…

“Web 3.0引领未来:下一代互联网技术将来袭!“

"下一代互联网技术&#xff0c;称为Web 3.0或Web3&#xff0c;主要利用机器学习、人工智能&#xff08;AI&#xff09;和区块链技术。" 与 Web2 相比&#xff0c;Web3 为消费者提供了对其在线数据的更多自主权&#xff0c;而Web2 专注于托管在”集中式“网站上的用户…

rv1126-rv1109-yaffs2-mkyaffs2image610

今天使用了一下yaffs2功能 就是生成一个yaffs的包 从移植的角度先生成ro_1109.yaffs包 烧录进去 操作步骤&#xff1a; 创建和生成ro文件夹和 mkyaffs2image610可执行程序 然后用 fakeroot ./mkyaffs2image610 ro ro_1109.yaffs 1 2生成了ro_1109.yaffs 例&#xff1a; …

无人机航拍图像拼接与目标识别

一、简介 无人机用来做图像侦察是常见功能&#xff0c;现有技术基本是无人机对某片区域进行飞行&#xff0c;人工实时监控飞行图像&#xff0c;将图像录制成视频供事后回放。此方法对人员业务要求比较高、反应速度足够快、不利于信息收集、录制视频丢失空间信息、对于后期开展区…

Ubuntu20网络总是连接失败,查看ip只有ipv6,没有ipv4

对于连接失败。 将网络适配器改成桥接模式。 原先使用的 NAT模式导致连接失败。 对于只有ipv6没有ipv4 是因为没有勾选桥接模式的物理状态。 当然可能还有其他原因&#xff0c;其他的就只能百度了。 继续点击网络适配器。 勾选复制物理网络连接状态。

【分享】一个基于 Python 开发的12306 抢票项目,快来学习!

哈喽&#xff0c;大家好&#xff0c;我是木易巷~ 12306抢票软件 "黄金周" 十一黄金周如约而至&#xff0c;这意味着某些开源项目又将迎来一次繁荣的热潮。这次&#xff0c;上榜的是一个与 12306 抢票相关的脚本&#xff0c;它基于 Python 编写&#xff0c;具备自动…

超全整理,性能测试——数据库索引问题定位+分析(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、数据库服务器添…

堆排序代码模板

#include<iostream> using namespace std; const int N 1e5 9; int h[N], n, m, Size;//小根堆//u表示三个点中的根节点 void down(int u) {int t u;//设t为三个点中最小的那个点//如果左儿子存在并且小于根节点就将左儿子赋值给tif (u * 2 < Size && h[u …

SourceTree 这是一个无效的源路径/URL

原因&#xff1a;权限检测出现问题 解决&#xff1a; ssh-add /Users/haijunyan/.ssh/id_rsa ssh-add -K /Users/haijunyan/.ssh/id_rsa 稍后&#xff0c;重新测试&#xff1a; 备注&#xff1a; https://www.ngui.cc/el/1727107.html?actiononClick