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


    1. 发送get请求

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

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

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

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

    1. #小文件下载
    2. import requests
    3. = requests.get("https://img.sitven.cn/Tencent_blog_detail.jpg")
    4. with open(r"D:\a.jpg""wb"as f:
    5.     f.write(r.content)
    6. #大文件下载
    7. import requests
    8. def test_downloads(url, file):
    9.     s = requests.session()
    10.     r = s.get(url, stream=True, verify=False)
    11.     with open(file"wb"as f:
    12.         for chunk in r.iter_content(chunk_size=512):
    13.             f.write(chunk) 
    14. if __name__ == "__main__":
    15.     url = "https://www.url.com/test/export"
    16.     file = "D:\\a.xlsx"
    17.     test_downloads(url=url, file=file)
    18. #转载至:https://blog.csdn.net/weixin_43507959/article/details/107326912
    1. timeout超时

    1. #导包
    2. import requests
    3. #循环10
    4. for i in range(0,10):
    5.     try:
    6.         url="http://xxxxxxxxxxxxxxxx"
    7.         data={
    8.             "head":{"lastnotice":0,"msgid":"","accessToken":"89a08bff-15d7-4d7a-9967-0b5f4fb699ce"},
    9.             "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":""}}
    10.         }
    11. #发送post请求,超时时间0.03s
    12.         r=requests.post(url=url,json=data,timeout=0.03)
    13.         print(r.text)
    14.         print(r.cookies)
    15.     except:
    16.         print('error')
    17. #可参考:https://blog.csdn.net/weixin_44350337/article/details/99655387
    1. 鉴权

    7.1 auth参数鉴权

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

    7.2 session操作

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

    7.3 token操作

    1. import requests
    2. url="http://xxxxxxxxxxxxxxx"
    3. json={
    4.     "head":{"accessToken":"","lastnotice":0,"msgid":""},
    5.     "body":{"username":"15623720880","password":"48028d2558577c526a017883211b4066","forceLogin":0}
    6. }
    7. r=requests.post(url=url,json=json)
    8. print(r.text)
    9. print(r.cookies)
    10. #登录成功后返回token,带入下一个接口
    11. for i in range(0,1):
    12.     try:
    13.         url="xxxxxxxxxxxxxxxxxx"
    14.         data={
    15.             "head":{"lastnotice":0,"msgid":"","accessToken":"89a08bff-15d7-4d7a-9967-0b5f4fb699ce"},
    16.             "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":""}}
    17.         }
    18.         r=requests.post(url=url,json=data,timeout=0.09)
    19.         print(r.text)
    20.         print(r.cookies)
    21.     except:
    22.         print('error')

    7.4 sign签名

    1. # appid:wxd930ea5d5a258f4f
    2. # mch_id:10000100
    3. # device_info:1000
    4. # body:test
    5. # nonce_str:ibuaiVcKdpRxkhJA
    6. import hashlib
    7. #需要加密的字符串
    8. stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";
    9. #构建一个对象为md
    10. md=hashlib.md5()
    11. #对stringA字符串进行编码
    12. md.update(stringA.encode()) 
    13. #生成后的加密值
    14. AES=md.hexdigest()
    15. #把加密的结果,小写转大写 upper函数
    16. AES=AES.upper()
    17. print(AES)
    18. 参考微信支付: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配置文件

    1. def server_ip():
    2.     '''
    3.     ait_ip=''开发环境的服务器ip
    4.     sit_ip=''测试环境的服务器ip
    5.     :return: 返回不同服务器的地址
    6.     '''
    7.     server_add={
    8.         'dev_ip' : 'http://his.xxxxxxxxxxx.com',
    9.         'sit_ip' : 'http://his.xxxxxxxxxxxx.comm'
    10.     }
    11.     return server_add['dev_ip']
    12. ------------------------------------------------------------------------------------
    13. def sql_conf():
    14.     '''
    15.     host数据库ip
    16.     user数据库用户名
    17.     password数据库密码
    18.     database:连接数据库名
    19.     port数据库端口
    20.     chrset数据库字符集 中文utf-8
    21.     :return:
    22.     '''
    23.     host='localhost'
    24.     user='root'
    25.     password='123456'
    26.     database='mysql'
    27.     port=3306
    28.     charset='utf8' #这用utf8,utf-8会报错
    29.     return host,user,password,database,port,charset

    8.2 common 公共的方法

    1. # 封装一个读取Excel表格数据的函数
    2. # 对Excel表格数据的读取需要用到一个库——xlrd库
    3. import xlrd
    4. def get_excel_value(i):
    5.     '''
    6.     读取表中一行的数据
    7.     :return:返回2,3行数据
    8.     '''
    9.     filename = r"../testdata/jiekou.xls" #文件要用相对路径
    10.     book = xlrd.open_workbook(filename)  # 打开一个工作薄,不需要手动进行关闭
    11.     # sheet = book.sheet_by_name("Sheet1") 根据工作表的名字,获取一个工作表对象
    12.     sheet = book.sheet_by_index(0)  # 获取一个工作表,以index的方式,这里是获取第1个工作表
    13.     return sheet.cell_value(i,1),sheet.cell_value(i,2)
    14. # print(sheet.nrows) #打印所有行
    15. # print(sheet.ncols) #打印所有列
    16. # print(sheet.row_values(0))  #打印第一行
    17. # print(sheet.col_values(0))  #打印第一列
    18. # print(sheet.cell_value(0,1)) #打印第一行,第二列
    19. # for i in range(1, sheet.nrows):
    20.     # print(sheet.cell_value(i,1),sheet.cell_value(i,2))# 打印单元格[所有数据]的值
    21.     # str='(sheet.cell_value(i,1),sheet.cell_value(i,2)))'
    22.     # print(str)
    23. # for i in range(1, sheet.nrows):
    24. #     # for j in range(0, sheet.ncols):
    25. #         print(sheet.cell_value(i,j)) # 打印单元格[i,j]的值
    26. ---------------------------------------------------------------------------------------------
    27. import pymysql
    28. from config.sql_conf import *
    29. def get_sql(sql):
    30.     '''
    31.     :param sql:运行查询的sql语句
    32.     :return:数据库查询结果
    33.     '''
    34.     #建立一个连接对象
    35.     host, user, password, database, port, charset=sql_conf()
    36.     db=pymysql.connect(host=host,user=user,password=password,database=database,port=port,charset=charset)
    37.     #建立一个游标
    38.     cursor=db.cursor()
    39.     #执行sql语句
    40.     cursor.execute(sql)
    41.     #把sql运行的数据保存在data变量里面
    42.     data=cursor.fetchall() #获取查询出的所有的值
    43.     cursor.close() #关闭游标
    44.     db.close() #关闭数据库连接
    45.     return data
    46. # print(get_sql("SELECT help_topic_id FROM help_topic WHERE Name='MOD'")) #执行sql语句
    47. # print(type(get_sql("SELECT help_topic_id FROM help_topic WHERE Name='MOD'")))

    8.3 testdata 测试数据

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

    8.4 test_case测试用例

    1. from common.get_mysql import get_sql
    2. from config.cof import server_ip
    3. from common.get_excel import *
    4. from config.sql_conf import *
    5. import requests
    6. # user_id=get_sql("SELECT help_topic_id FROM help_topic WHERE Name='MOD'")#提取数据库数据
    7. # print(user_id)#打印结果
    8. # assert get_sql("SELECT help_topic_id FROM help_topic WHERE Name='MOD'")#断言数据库的数据是否存在
    9. def test_aokao_login():
    10.      url=server_ip()+'/service/user/login'
    11.      username,password=get_excel_value(1) #读取文件第二行数据
    12.      json={
    13.           "head":{"accessToken":"","lastnotice":0,"msgid":""},
    14.           "body":{"username":username,"password":password,"forceLogin":0}
    15.      }
    16.      # usernamepassword=get_excel_value(4)[0] #读取文件第二行数据
    17.      # print(type(usernamepassword))
    18.      # #把str类型转为字典格式 eval 函数
    19.      # json=eval(usernamepassword)
    20.      r=requests.post(url=url,json=json)
    21.      print(r.text)
    22.      assert r.status_code==200 #断言状态码是否等于200
    23.      assert '"accessToken":"89a08bff-15d7-4d7a-9967-0b5f4fb699ce",' in r.text #断言返回信息是否包含accesstoken
    24. def test_aokao_registadd():
    25.      url = server_ip()+'/service/registration/registadd'
    26.      data = {
    27.           "head": {"lastnotice"0"msgid""""accessToken""89a08bff-15d7-4d7a-9967-0b5f4fb699ce"},
    28.           "body": {"clinicid""978f661e-1782-43bd-8675-b0ff1138ab7c""deptid""09b8515b-b01b-4771-9356-aed6b5aa01bf",
    29.                    "doctorid""65ac0251-10ff-473a-af8a-20e8969176f7""registtype"0"card_num""""bcc334""",
    30.                    "patientopt"1"bkc368""1",
    31.                    "patient": {"cardid""""medicalcardid""""label""""sourcetype"1"nationid""01",
    32.                                "maritalstatus"0"address""""company""""jobname""""email""",
    33.                                "remark""""bcc334""""name""11""gender"1"phone""",
    34.                                "birthdate""2020-03-23""patienttype"1"szsbcardid"""}}
    35.      }
    36.      r = requests.post(url=url, json=data, timeout=0.09)
    37.      print(r.text)
    38.      print(r.cookies)
    39.      assert r.status_code == 200  # 断言状态码是否等于200

    8.5 report 报告

    主要存放htmlxml报告
    

    8.6 run_case 测试执行

    1. import pytest
    2. '''
    3. 测试文件以test_开头,(以—_test结尾也可以)
    4. 测试类以Test开头,并且不能带有init 方法
    5. 测试函数以test_开头
    6. 断言使用基本的assert即可
    7. '''
    8. #如何去运行测试用例,_test开头的函数就可以,判断用例运行是否成功,assert断言
    9. if __name__=="__main__":
    10.     #单个文件运行,运行添加,对应的文件路径,路径要用相对路径
    11.     # pytest.main(['../test_case//test_case_01.py'])
    12.     #多个文件运行,运行添加多个对应的文件路径,列表的形式,去添加多个文件的路径
    13.     # pytest.main(['../test_case/test_fore.py','../test_case/Dynamic correlation_token.py'])
    14.     #运行整个目录,添加目录的路径
    15.     pytest.main(['../test_case/','--html=../report/report.html','--junitxml=../report/report.xml'])
    16. '''
    17. pytest生成报告:
    18. 1、生成html报告
    19. '--html=../report/report.html'
    20. 2、生成xml报告
    21. '--junitxml=../report/report.xml'
    22. '''

    end

    
    

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

     

  • 相关阅读:
    微信公众号模板消息api
    存储数据迁移需求和迁移工具分析
    QT QLineEdit显示模式掩码输入验证自动补全示范
    在Oracle的ADR中设置自动删除trace文件的策略
    【QML】 如何将Qt Design Studio 创建的UI项目转换为应用程序
    【MicroPython ESP32】ssd1306模块基于GB2312字库驱动0.96“I2C屏幕汉字显示示例
    电脑开机密码忘了怎么办
    hive的安装配置笔记
    异常与错误处理高级用法
    使用ngrok内网穿透后,调用相关接口报ERR_NGROK_6024 异常
  • 原文地址:https://blog.csdn.net/xiao1542/article/details/133868672