python+requests+pytest接口自動化

1、發(fā)送get請求

#導(dǎo)包
import requests
#定義一個url
url = "http://xxxxxxx"
#傳遞參數(shù)
payload="{\"head\":{\"accessToken\":\"\",\"lastnotice\":0,\"msgid\":\"\"},\"body\":{\"user_name\":\"super_admin\",\"password\":\"b50c34503a97e7d0d44c38f72d2e91ad\",\"role_type\":1}}"
headers = {
  'Content-Type': 'text/plain',
  'Cookie': 'akpsysessionid=bafc0ad457d5a99f3a4e53a1d4b32519'
}
#發(fā)送get請求
r = requests.get( url=url,headers=headers, data=payload)
#打印結(jié)果
print(r.text)
#解碼
print(r.encoding)
print(r.text.encode('utf-8').decode('unicode_escape'))#先把返回的結(jié)果轉(zhuǎn)換成utf-8屡拨,再去解碼成中文的編碼

2只酥、發(fā)送post請求

#導(dǎo)包
import requests
#定義一個url
url = "http://xxxxxxx"
#傳遞參數(shù)
payload="{\"head\":{\"accessToken\":\"\",\"lastnotice\":0,\"msgid\":\"\"},\"body\":{\"user_name\":\"super_admin\",\"password\":\"b50c34503a97e7d0d44c38f72d2e91ad\",\"role_type\":1}}"
headers = {
 'Content-Type': 'text/plain',
 'Cookie': 'akpsysessionid=bafc0ad457d5a99f3a4e53a1d4b32519'
}
#發(fā)送post請求
r = requests.post( url=url,headers=headers, data=payload)
#打印結(jié)果
print(r.text)

3褥实、發(fā)送https請求

import requests
url='https://www.ctrip.com/'
#第一種解決方案,發(fā)送請求的時候忽略證書裂允,證書的參數(shù)verify用的比較多
r=requests.post(url=url,verify=False)#verify參數(shù)默認(rèn)為True损离,值為False,表示忽略證書
#第二張解決方案绝编,verify里面添加證書的路徑
r=requests.post(url=url,verify='證書的路徑')#verify參數(shù)默認(rèn)為True僻澎,值為False,表示忽略證書
print(r.text)

4十饥、文件上傳

import requests
file = {
    'filename':open('文件名稱','rb')
}
response = requests.post("網(wǎng)址",file)
print(response.text)

5窟勃、文件下載

#小文件下載
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)
#轉(zhuǎn)載至:https://blog.csdn.net/weixin_43507959/article/details/107326912

6、timeout超時

#導(dǎo)包
import requests
#循環(huán)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":""}}
        }
#發(fā)送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

7拳恋、鑒權(quán)
7、1砸捏、auth參數(shù)鑒權(quán)

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發(fā)起請求
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";
#構(gòu)建一個對象為md
md=hashlib.md5()
#對stringA字符串進(jìn)行編碼
md.update(stringA.encode()) 
#生成后的加密值
AES=md.hexdigest()
#把加密的結(jié)果,小寫轉(zhuǎn)大寫 upper函數(shù)
AES=AES.upper()
print(AES)
參考微信支付:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3

8弟灼、自動化模塊劃分

config 配置文件(python package)#directory和python package大同小異
common 公共的方法(python package)
testdata 測試數(shù)據(jù)(python package)
test_case測試用例(python package)
report 報告(directory)
run_case 測試執(zhí)行(python package)
log 日志


image.png

8级解、1、config配置文件

def server_ip():
    '''
    ait_ip=''開發(fā)環(huán)境的服務(wù)器ip
    sit_ip=''測試環(huán)境的服務(wù)器ip
    :return: 返回不同服務(wù)器的地址
    '''


    server_add={
        'dev_ip' : 'http://his.xxxxxxxxxxx.com',
        'sit_ip' : 'http://his.xxxxxxxxxxxx.comm'
    }
    return server_add['dev_ip']
------------------------------------------------------------------------------------
def sql_conf():
    '''
    host數(shù)據(jù)庫ip
    user數(shù)據(jù)庫用戶名
    password數(shù)據(jù)庫密碼
    database:連接數(shù)據(jù)庫名
    port數(shù)據(jù)庫端口
    chrset數(shù)據(jù)庫字符集 中文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表格數(shù)據(jù)的函數(shù)
# 對Excel表格數(shù)據(jù)的讀取需要用到一個庫——xlrd庫
import xlrd
def get_excel_value(i):
    '''
    讀取表中一行的數(shù)據(jù)
    :return:返回2掩驱,3行數(shù)據(jù)
    '''
    filename = r"../testdata/jiekou.xls" #文件要用相對路徑
    book = xlrd.open_workbook(filename)  # 打開一個工作薄芒划,不需要手動進(jìn)行關(guān)閉
    # sheet = book.sheet_by_name("Sheet1") 根據(jù)工作表的名字,獲取一個工作表對象
    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))# 打印單元格[所有數(shù)據(jù)]的值
    # 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:數(shù)據(jù)庫查詢結(jié)果
    '''
    #建立一個連接對象
    host, user, password, database, port, charset=sql_conf()
    db=pymysql.connect(host=host,user=user,password=password,database=database,port=port,charset=charset)
    #建立一個游標(biāo)
    cursor=db.cursor()
    #執(zhí)行sql語句
    cursor.execute(sql)
    #把sql運行的數(shù)據(jù)保存在data變量里面
    data=cursor.fetchall() #獲取查詢出的所有的值
    cursor.close() #關(guān)閉游標(biāo)
    db.close() #關(guān)閉數(shù)據(jù)庫連接
    return data
# print(get_sql("SELECT help_topic_id FROM help_topic WHERE Name='MOD'")) #執(zhí)行sql語句
# print(type(get_sql("SELECT help_topic_id FROM help_topic WHERE Name='MOD'")))

8涮帘、3拼苍、testdata 測試數(shù)據(jù)

主要存放xls,txt调缨,csv測試數(shù)據(jù)
image.png

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'")#提取數(shù)據(jù)庫數(shù)據(jù)
# print(user_id)#打印結(jié)果
# assert get_sql("SELECT help_topic_id FROM help_topic WHERE Name='MOD'")#斷言數(shù)據(jù)庫的數(shù)據(jù)是否存在

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

     # usernamepassword=get_excel_value(4)[0] #讀取文件第二行數(shù)據(jù)
     # print(type(usernamepassword))
     # #把str類型轉(zhuǎn)為字典格式 eval 函數(shù)
     # json=eval(usernamepassword)
     r=requests.post(url=url,json=json)
     print(r.text)
     assert r.status_code==200 #斷言狀態(tài)碼是否等于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  # 斷言狀態(tài)碼是否等于200

8、4棚点、report 報告

主要存放html早处,xml報告
image.png

8、5瘫析、run_case 測試執(zhí)行

import pytest

'''
測試文件以test_開頭砌梆,(以—_test結(jié)尾也可以)
測試類以Test開頭,并且不能帶有init 方法
測試函數(shù)以test_開頭
斷言使用基本的assert即可
'''
#如何去運行測試用例贬循,_test開頭的函數(shù)就可以咸包,判斷用例運行是否成功,assert斷言
if __name__=="__main__":
    #單個文件運行杖虾,運行添加烂瘫,對應(yīng)的文件路徑,路徑要用相對路徑
    # pytest.main(['../test_case//test_case_01.py'])
    #多個文件運行奇适,運行添加多個對應(yīng)的文件路徑坟比,列表的形式,去添加多個文件的路徑
    # 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'
'''
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末皮仁,一起剝皮案震驚了整個濱河市籍琳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贷祈,老刑警劉巖趋急,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異势誊,居然都是意外死亡呜达,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門键科,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闻丑,“玉大人漩怎,你說我怎么就攤上這事勋颖。” “怎么了勋锤?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵饭玲,是天一觀的道長。 經(jīng)常有香客問我叁执,道長茄厘,這世上最難降的妖魔是什么矮冬? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮次哈,結(jié)果婚禮上胎署,老公的妹妹穿的比我還像新娘。我一直安慰自己窑滞,他們只是感情好琼牧,可當(dāng)我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哀卫,像睡著了一般巨坊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上此改,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天趾撵,我揣著相機(jī)與錄音,去河邊找鬼共啃。 笑死占调,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的移剪。 我是一名探鬼主播妈候,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼挂滓!你這毒婦竟也來了苦银?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赶站,失蹤者是張志新(化名)和其女友劉穎幔虏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贝椿,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡想括,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了烙博。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瑟蜈。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖渣窜,靈堂內(nèi)的尸體忽然破棺而出铺根,到底是詐尸還是另有隱情,我是刑警寧澤乔宿,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布位迂,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏掂林。R本人自食惡果不足惜臣缀,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泻帮。 院中可真熱鬧精置,春花似錦、人聲如沸锣杂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹲堂。三九已至狼讨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柒竞,已是汗流浹背政供。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留朽基,地道東北人布隔。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像稼虎,于是被迫代替她去往敵國和親衅檀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容