第十章 自動化測試 Pytest+Jenkins
之前unittest框架
pytest是?python的一種單元測試框架
+數(shù)據(jù)庫(關(guān)系型數(shù)據(jù)庫MySQL,非關(guān)系型數(shù)據(jù)庫redis)
需要用到 requests(請求),yml(pyyaml讀取測試用例data.yaml的一個包),allure(測試報告),log(記錄運行日志),pyMySQL(數(shù)據(jù)庫)插件
跟Jenkins打通,發(fā)送到釘釘或企業(yè)微信
一,環(huán)境搭建
①python安裝
python官網(wǎng) -- 點擊Download-Windows -- 下載3.7.6版本 x86-64 -- 雙擊安裝包
-- 需要勾選 add python 3.7 to path
cmd--控制臺--輸入python 回車--顯示python3.7.6就表示安裝成功了
可以嘗試測試下: print(“pytest。。?!保┗剀? --? 顯示運行結(jié)果?pytest。。。
②編輯器pycharm安裝
選擇other versions(因為最新版本沒辦法破解)--? 找到2021-01-13號版本 -- 雙擊安裝成功即可 --打開時點擊試用(30天試用期)
二,接口測試
(1)HTTP是一個協(xié)議(服務(wù)器傳輸超文本到瀏覽器的傳送協(xié)議)
是基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù)(HTML文件,圖片文件,查詢結(jié)果等)
(2)具體工作流程:eg,訪問www.baidu.com
① DNS先進行域名的解析 將域名地址轉(zhuǎn)化為IP地址 Remote Address
②發(fā)起TCP請求,三次握手建立連接
③客戶端 發(fā)送HTTP請求到服務(wù)端
④服務(wù)器端處理請求,返回HTTP報文
⑤瀏覽器接收返回HTTP報文,進行渲染展示
⑥?斷開連接 進行四次揮手
(3)HTTP資源

空白--右鍵--檢查 進行查看
三,pytest詳細介紹
首先建一個新的項目
①打開 pycharm? +new project
②Location 選擇項目文件地址? 再+一層 ApiTest
? ? Base interpret 選擇python安裝目錄? ?點擊create
main.py? 簡單的測試代碼,點擊三角符號,可運行,說明服務(wù)器創(chuàng)建成功了
③選中 ApiTest文件夾 -- 右鍵 --new --python file? eg:test_get
(1)python requests安裝
在剛新建的test_get.py文件中
import requests? #引入包,請求接口
# 如果爆紅
①可以把鼠標點上去,會彈出提示-- install package requests --點擊之后就會安裝?
②最下方一行找到terminal(終端的意思)--輸入:pip3 /pip install requests
③最下方一行找到python packages,搜索requests,安裝就行了
(2)python requests使用
輸入requests.? 自動會彈出提示,可以選擇想用的方法
#?requests.post
#?requests.get
#?鼠標左鍵+CTRL??可以跳進去查看源碼
def get(url,params=none,**kwargs)#函數(shù)定義,參數(shù):url必傳,params選傳,不傳時默認為none,關(guān)鍵字參數(shù),傳的話以key,value形式
def post(url,data=none,json=none,**kwargs)#函數(shù)定義,參數(shù):url必傳,params選傳,不傳時默認為none,關(guān)鍵字參數(shù),傳的話以key,value形式

簡單的使用例子:
import?requests?
r = requests.get("https://www.baidu.com") # 用r來接收接口請求的結(jié)果 r={response}
print (r.status_code)??
print (r.json())? #? r. 會提示response中的返回值內(nèi)容
可以點擊代碼前的位置,打上斷點
右鍵--debug 查看
點擊三角符號繼續(xù)運行

簡單的使用例子(帶params參數(shù)):
選中?ApiTest文件夾 -- 右鍵 --new --python file? eg:test_get_params
import?requests?
params1={“number”:“13167894587”,“appkey”:“0c565f14687d84”}# python中字典數(shù)據(jù)類型,先定義參數(shù)
r?=?requests.get(url="https://www.baidu.com",params=params1)
print (r.status_code)??
print (r.json())??
或者直接輸入?yún)?shù)
import?requests?
r?=?requests.get(url="https://www.baidu.com",params={“number”:“13167894587”,“appkey”:“0c565f14687d84”})?

簡單的使用例子(post帶json參數(shù)):
選中?ApiTest文件夾 -- 右鍵 --new --python file? eg:test_post_params
import?requests?
json_data={"title"="food",“number”:“13167894587”,“appkey”:“0c565f14687d84”}# python中字典數(shù)據(jù)類型,先定義參數(shù)
r?=?requests.post(url="https://www.baidu.com",json=json_data)# 看接口body中傳參是data還是json,就用相應(yīng)的參數(shù)
print (r.status_code)??
print (r.json())?
(3)requests請求中加入請求頭(多個接口會用到,拎出來避免冗余)
反爬程序,會出現(xiàn)418
Headers:Cookie,User-agent
簡單的使用例子:
import?requests?
r?=?requests.post(url="https://www.baidu.com",headers={"user-Agent":"Mozilla/5.0..."})#接口中的**kwargs關(guān)鍵字參數(shù),可選參數(shù)
print (r.status_code)??
print (r.json())?
四,代碼封裝
(1)pip install pytest #先安裝pytest第三方包
新建一個 python file:注意:文件命名規(guī)范:以test_開頭,如果不規(guī)范不會去執(zhí)行
def test_one():
? ? ? expect=1
? ? ? actual=1
? ? ? assert expect == actual? #關(guān)鍵字assert?用于捕獲錯誤并提示用戶定義的錯誤消息
#?assert關(guān)鍵字也稱斷言函數(shù)。 常用于在程序運行時檢測某條件是否滿足,如果不滿足則會報錯。
每條測試用例都要def一個 test_xx方法
(2)**程序運行方式:
①命令行運行
最下方一行找到terminal(終端的意思)--輸入:pytest test_one(測試用例文件名)
test+tab鍵,會展示相關(guān)文件名
運行結(jié)果:綠色點 成功? 紅色F 失敗
②三角形圖標運行(可分別運行測試用例)
執(zhí)行方式:tools-- python inter grated tools --testing -- default test runner:pytest
或者直接搜索pytest,可以定位到python inter grated tools?
(3)常用斷言方式:
? ? ? ?? 等于: ==? ? ?不等于:!=? ? 大于:>? ?小于:<?? ? ? ?屬于:in? 不屬于:not in?
? ? ? ? ?大于等于:?> =? ?? ? ? ? ? ?小于等于:?< =? ?? ? 是:is? ?不是:is not
(4)? ? ? ? ? CTRL+ALT 代碼格式化 ? ? ? tab鍵縮行? ?
(5)? ? ? ? python requests使用改進
import?requests?
def test-baidu():
r = requests.get("https://www.baidu.com")?
print (r.status_code)??
assert? ?r.status_code ==200
r2 = r.json() #JSON結(jié)果為:{‘status’:0,‘msg’:‘ok’,‘result’:{‘shouji’:‘13157489874’,‘city’:‘杭州’,‘company’:‘中國移動’}}
assert r2【‘status’】==0
assert?r2【‘msg’】==‘ok’
assert?r2【‘result’】【‘shouji’】==‘13167118005’
assert?r2【‘result’】【‘city’】==‘ok’