pytest 介面自動化從百草園到三味書屋...
- 開發環境
- requests
- 安裝requests
- GET 請求
- POST請求
- 添加header資訊
- 結合pytest小實戰
- flask
- 安裝 flask
- 最簡單的flask
- flask - POST請求
- flask本地json介面
- 動態寫法
- flask一些常用的屬性
- jsonpath
- jsonpath 運算式規范
- 炫酷高端的查找方式
- 小實戰
- 介面(flask):
- 物體類:
- 客戶端:(paramData)
底部會給出完整代碼!,
??:本篇不說廢話,全是干貨!
開發環境
- pytest 6.2.5
- python 2.7.16
- PyCharm 2021.2.3
- system mac
- requests 2.26.0
- flask 2.0.2
- jsonpath 0.82
接上一篇:pytest web自動化從百草園到三味書屋…
本篇采用介面來自玩android
requests
安裝requests
pip install requests
查看是否安裝成功: pip show requests
GET 請求
最簡單的使用:
url: str = "https://www.wanandroid.com/{}"
result = requests.get(url.format("article/list/0/json"))
print(result.text)
來看看結果:
可以看到雖然請求出來了,但是感覺有點丑,來格式化一下!
import json
url: str = "https://www.wanandroid.com/{}"
# TODO
result = requests.get(url.format("article/list/0/json"))
print(json.dumps(json.loads(result.text), indent=4, ensure_ascii=False))
這里采用json來進行格式化
效果圖:
可能會有同學問json.dumps的引數,分別是什么意思:
json.dumps("json資料", indent=4, ensure_ascii=False)
- 引數一:json資料
- 引數二:格式化后的空格
- 引數三:是否解碼
一張圖搞清楚:

POST請求
post請求的話一定會攜帶引數,這里拿登陸來舉例:
loginJson = {
"username": "1********0", # 這里輸入自己的,如果沒有自己創建一個
"password": "o******7",
}
resultData = requests.post(url.format("user/login"), params=loginJson)
resultData.encoding = 'utf-8'
# print(resultData.text)
# 格式化
print(json.dumps(json.loads(resultData.text), indent=4, ensure_ascii=False))
請求結果:

這里采用的是登陸的介面,如果沒有賬號的同學在這里注冊!

最基本的使用就這么多
還有一些需要知道的引數:
添加header資訊
什么是header?
header就是發送網路請求時候 請求頭部的資訊
比如說,在企業開發時,請求頭(header)中必加的是token,token表示是每一位用戶的資訊.
參考檔案
百度百科參考
如何添加head,以百度為例:
先來看看不加header的效果:
baiduUrl = 'https://www.baidu.com/'
response = requests.get(baiduUrl)
print(response.text)
會出現亂碼:
添加header的效果:
可以看出,不僅不亂碼了,而且還給格式化了一下!
??: 這里的header內容不用記,一般要添加的話,讓你添加的那個人都會告訴你需要添加什么!
結合pytest小實戰
代碼比較簡單,直接看代碼:
import pytest
import requests
@pytest.fixture
def requestUrl():
return "https://www.wanandroid.com/{}"
class TestRequests:
@pytest.mark.parametrize("index", ['0', '1', '2', '3', '4', '5',"test assert"])
def test_demo01(self, requestUrl: str, index: str):
result = requests.get(requestUrl.format("article/list/{}/json").format(index))
# 為了方便查看,先不格式化
# print("result<{}>:".format(index) + json.dumps(json.loads(result.text), indent=4, check_circular=False))
print("result<{}>:".format(index) + result.text)
# 斷言是否成功
assert result.ok
if __name__ == '__main__':
pytest.main(['-s'])
這里采用pytest的parametrize機制,一共測驗7條資料
- 0-5條資料是正確的
- 第7條資料test assert 是錯誤的!
來看看效果:

flask
安裝 flask
pip install flask
查看是否安裝成功: pip show flask
什么是flask?
如果你覺得你們后臺寫的介面太丑,那么就可以用到flask,flask是用來本地自己寫介面的!
最簡單的flask
from flask import Flask
flask = Flask(__name__)
@flask.get('/')
def test_flask_demo1():
return "hello flask"
if __name__ == '__main__':
flask.run()
來看看效果:
??:默認是get請求
flask - POST請求
post請求稍微麻煩一點點,post請求不能直接在瀏覽器訪問,需要先開啟服務,然后通過上面講到的requests來訪問!
例如這樣:

在開發中沒有人直接回傳一個字串的,都是回傳的json格式的資料
例如這樣:
咋們肯定不會寫這么復雜,就先來個簡單的.
先來了解一下json,生成json串我總結了三種方法:
- 方式一:
這是我最喜歡的方式,簡單明了!

- 方式二:
這種需要手動寫一點點代碼,能實作,但是我個人不喜歡用
- 方式三:
這是最簡單的方式,不推薦使用,不好維護
flask本地json介面
flask = Flask(__name__)
@flask.get('/')
def test_flask_demo1():
bean = StudentFlaskBean("張三", "18", True)
print("引數為:", json.dumps(bean.__dict__, indent=4, ensure_ascii=False))
return json.dumps(bean.__dict__, indent=4, ensure_ascii=False)
if __name__ == '__main__':
flask.run()
效果圖:

動態寫法
如果我們想要動態加載page頁怎么來做呢?
只需要這樣:

來看看效果圖:

只要格式正確都可以輸入監測到
flask一些常用的屬性
- 檢測post輸入的內容:
request.get_data()

這種一點也不好用,因為結果前面會帶個b,例如:
b'username=12345678913&pwd=666666'
request.get_json()

這種方式比較好,因為可以直接獲取到某個屬性!
檢測get的一些常用屬性:

這里比較簡單,因為是get請求,所以直接在瀏覽器訪問即可
效果圖為:

到這里flask就差不多了,如果你還想進階一下,點我查看
走到這里同學們應該會自己請求一個介面并且直接搞一個本地的url了,但是呢,本地url都是一個json,如何決議json獲取到對應的資料呢?
接下來我就給大家介紹jsonpath!
jsonpath
什么是jsonpath?
從名字就能看出來,是用來決議json資料的
先來規定json資料:
resultJsonData = {
"schoolInfo": {
"name": "實驗一中",
"time_start": "2000-1-1"
},
"grade": [
{
"name": "雄鷹班",
"classData": [
{
"name": "張三",
"age": 13.5
},
{
"name": "杜子騰",
"age": 13.2
}
]
},
{
"name": "獵鷹班",
"classData": [
{
"name": "黃飛鴻",
"age": 13.7
},
{
"name": "郭德綱",
"age": 14.1
}
]
}
]
}
來看看使用,直接上效果圖:

jsonpath 運算式規范
- $ 表示根結點
- . 表示取子節點
- … 表示獲取所有符合條件的內容
- * 代表所有元素的節點
- [] 表示迭代器的標識 用于處理下標等情況
- [,] 多個結果選擇
- ?() 過濾操作
- @ 當前節點
炫酷高端的查找方式

這里非常簡單,仔細看看就明白了,這里就不過多多介紹啦!
小實戰
總結:
- requests 用來請求介面 get / post 等
- flask 用來自己寫本地介面
- jsonpath 用來決議json資料
寫了這么多代碼,感徑訓是有點懵懵的,來個小實戰疏通一下.
需求:
通過flask本地寫一個登陸功能,然后使用requests來請求,最后采用jsonpath決議資料,判斷是否登陸成功!
相信大家已經了如指掌,直接看代碼了:
介面(flask):
import json
import time
from flask import Flask, request
@flask.post('/login')
def testLogin():
username = ""
pwd = ""
msg = ""
data = None
try:
if request.json['username'] == "12345678913":
username = request.json['username']
if request.json['pwd'] == "666666":
pwd = request.json['pwd']
msg = "恭喜你,成功了,小伙子代碼寫的不賴啊!"
data = Data("成功回傳資料啊,,", getCurrentData())
else:
msg = "密碼輸入錯誤.. 仔細檢查一下啊,,"
else:
username = request.json['username']
pwd = "******"
msg = "賬號輸入錯誤,, 密碼無法查看"
except Exception:
data = None
loginBean = LoginBean(username, pwd, msg, data)
return json.dumps(loginBean.__dict__, indent=4, ensure_ascii=False)
# 獲取當前時間
def getCurrentData() -> str:
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
if __name__ == '__main__':
flask.run()
物體類:
class Data:
def __init__(self, title: str, currentTime: str):
self.title = title # 成功回傳標題
self.currentTime = currentTime # 成功回傳當前時間
class LoginBean:
def __init__(self, username: str, pwd: str, msg, data: None):
self.username = username # 賬號
self.pwd = pwd # 密碼
self.msg = msg # 登陸回傳資訊
if data is not None:
self.data = data.__dict__ # 具體登陸資訊 失敗回傳null
客戶端:(paramData)
import json
import requests
paramData = {
"username": "12345678913",
"pwd": "666666"
}
result = requests.post("http://127.0.0.1:5000/login", json=paramData)
print(json.dumps(json.loads(result.text), indent=4, ensure_ascii=False))
來看看實作的幾種效果吧:
| 說明 | 圖片展示 |
|---|---|
| 賬號錯誤 | ![]() |
| 密碼錯誤 | ![]() |
| 引數錯誤 | ![]() |
| 輸入正確 | ![]() |
好了,就講這么多,如果覺得哪一些知識點寫的不全,需要補充請在評論區留言哦!
完整代碼
原創不易,您的點贊就是對我最大的支持!
猜你喜歡:
- pytest web自動化從百草園到三味書屋…
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/392289.html
標籤:其他




