「第十七章」 Python3 接口項目實戰一(WEB項目)
17.1 接口測試項目搭建
17.1.1 教育局招生管理系統部署
教育局招生管理系統是基於java+mysql,下面介紹它的部署過程。
1.從我的網盤下載部署文件。
2.安裝jdk以及配置環境變量。
點擊文件進行安裝。
下一步下一步直接安裝。
本人的安裝路徑是 C:\\Program Files\\Java\\jdk1.7.0_17。
安裝完成後需要設置環境變量從而使編譯器正常使用。右擊“計算機”選擇“屬性”選擇左邊“高級系統設置”à選擇上面“高級”選項卡點擊右下角“環境變量”按鈕。
接下來彈出的對話框會出現用戶變量和系統變量。用戶變量對當前登錄賬戶有效,系統變量對所有用戶都有效,讀者可根據需要設置。
環境變量配置的方法/步驟:
1). 在系統變量裡點擊新建,變量名填寫JAVA_HOME,變量值填寫JDK的安裝路徑,在這裡就填寫“C:\\Program Files\\Java\\jdk1.7.0_17”。
2). 在系統變量裡點擊新建變量名填寫CLASSPATH,變量值填寫。“.;%JAVA_HOME%\\lib;%JAVA_HOME%\\lib\\tools.jar”,注意不要忘記前面的點和中間的分號。
3). 在系統變量裡找到Path變量,這是系統自帶的,不用新建。雙擊Path,由於原來的變量值已經存在,故應在已有的變量後加上“;%JAVA_HOME%\\bin;%JAVA_HOME%\\jre\\bin”。注意前面的分號。
驗證的方法:在運行框中輸入cmd命令,回車後輸入javac,按回車出現以下畫面。
3.解壓 apache-tomcat-7.0.42 壓縮包,把 recruit.students.war 包放到E:\\apache-tomcat-7.0.42\\webapps 下。
4. 點擊 安裝mysql 服務端。
設置mysql賬戶和密碼: root /root
默認下一步下一步安裝完成。
5.用mysql 客戶端工具 navicat 連接mysql ->新建一個recruit_students 庫。
6.把 recruit_students_sql 數據文件導入到新建的庫中。
7.導完之後,會看到如下圖一些表。
8.修改war包下的數據庫配置文件:datasource.properties。
E:\\apache-tomcat-7.0.42\\webapps\\recruit.students\\WEB-INF\\classes 下。
配置jdbc的URL。
9.mysql 數據庫用戶訪問授權。
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
commit;
10.點擊E:\\apache-tomcat-7.0.42\\bin下的startup 啟動tomcat.
11.訪問教育局招生系統。
訪問地址:http://127.0.0.1:8090/recruit.students/login/view。
初始賬戶和密碼: admin /test123
備註:tomcat默認的端口是8080,我用的是8090,是因為修改了tomcat的端口。
17.1.2教育局招生管理系統的功能清單
17.2 項目第一個接口測試用例
教育局招生管理系統登錄接口用例實現步驟:
1、打開抓包工具:fiddler。
2、登錄教育局招生管理系統。
3、抓取登錄http請求。
4、分析登錄http請求(請求地址、是否重定向、get請求還是post請求、請求的頭信息、請求的response)。
5、數據的處理(處理抓取到的頭信息)
6、編寫接口代碼。
7、人工驗證接口測試結果。(後續講斷言)
第一步:下面對fiddler抓取到的數據進行分析。
【請求方法】:帶參數的get
【請求地址】:http://127.0.0.1:8090/recruit.students/login/in?account=admin&pwd=660B8D2D5359FF6F94F8D3345698F88C
【請求頭信息】:
Host: 127.0.0.1:8090
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://127.0.0.1:8090/recruit.students/login/view
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=AED5BBB1B5E4F9BEDCC3A0FC88668871; userInfoCookie=""
【請求的response】:空
請求的 response 為空是因為登錄的時候,做了跳轉,狀態碼為:302,跳轉到了
http://127.0.0.1:8090/recruit.students/school/manage/index 這個地址,這個狀態碼為200。
查看http://127.0.0.1:8090/recruit.students/school/manage/index 這個地址請求的response,返回的是登陸後的信息。
通過分析,我們是清楚的瞭解到這個接口的情況。
第二步:接著還需要請求頭信息的處理,去掉一些沒用的請求頭信息,保留如下:
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Referer": "http://127.0.0.1:8090/recruit.students/login/view",
【Connection】:如果只是測試登錄接口,這個參數可以去掉,如果需要測試登錄之後新建學校,那這個頭信息就需要保留。
【User-Agent】:模擬用戶利用瀏覽器訪問Web網站的真實行為,每個接口都需要。
【Referer】:登錄重定向的時候用到。
第三步:最後編寫代碼實現。
程序實現:
方式一:直接在URL上寫完整的URL。
import requests
url="http://127.0.0.1:8090/recruit.students/login/in?account=admin&pwd=660B8D2D5359FF6F94F8D3345698F88C"
#把請求頭信息進行處理,去掉一些沒用的,保留一些有用頭信息。
headers = {
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Referer": "http://127.0.0.1:8090/recruit.students/login/view",
}
# 發送get請求
response = requests.get(url,headers = headers)
# 查看響應內容,response.text 返回的是Unicode格式的數據
print(response.text)
# 查看響應碼
print(response.status_code)
運行結果:
方式二:帶參數的get請求。
import requests
url="http://127.0.0.1:8090/recruit.students/login/in?"
#把請求頭信息進行處理,去掉一些沒用的,保留一些有用頭信息
headers = {
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Referer": "http://127.0.0.1:8090/recruit.students/login/view",
}
# URL參數
payload = {'account': 'admin','pwd':'660B8D2D5359FF6F94F8D3345698F88C'}
# 發送get請求
response = requests.get(url,headers = headers,params=payload)
# 查看響應內容,response.text 返回的是Unicode格式的數據
print(response.text)
# 查看響應碼
print(response.status_code)
運行結果:
方式三:data=payload 的Post請求。
import requests
url="http://127.0.0.1:8090/recruit.students/login/in?"
#把請求頭信息進行處理,去掉一些沒用的,保留一些有用頭信息·
headers = {
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Referer": "http://127.0.0.1:8090/recruit.students/login/view",
}
# URL參數
payload = {'account': 'admin','pwd':'660B8D2D5359FF6F94F8D3345698F88C'}
# 發送Post請求
response = requests.post(url,headers = headers,data=payload)
# 查看響應內容,response.text 返回的是Unicode格式的數據
print(response.text)
# 查看響應碼
print(response.status_code)
運行結果:
這3種方式都實現了教育局招生管理系統登錄接口用例,我們再打印請求response後的URL
http://127.0.0.1:8090/recruit.students/school/manage/index;jsessionid=13284D7E10CA9E92A443873A59D9E3A1,從這個地址看出,我們登錄的時候,接口重定向,跳轉到了http://127.0.0.1:8090/recruit.students/school/manage/index 地址,跟我們通過抓包的結果是一樣的。
第四步:驗證結果。
通過程序運行的結果和抓包的結果對比,驗證通過。
17.3 測試用例斷言
接口用例的斷言設計,客戶端需要發送了http請求,服務端返回 response(html內容),就需要我們考慮提取html內容裡的元素作為用例的檢查點,例如
教育局招生管理系統登錄接口用例登錄成功後,我們可以設置斷言看是否可以從服務端返回 response(html內容)中獲取“退出登錄”文本。
第一步:首先,我們先發送請求,獲取服務端返回 response(html內容)進行分析。
為了更進一步確認,可以把返回的html內容拷貝到 EditPlus 3 下查看。
第二步,編寫代碼,進行斷言判斷。
程序實現:
from bs4 import BeautifulSoup
import requests
url="http://127.0.0.1:8090/recruit.students/login/in?"
#把請求頭信息進行處理,去掉一些沒用的,保留一些有用頭信息·
headers = {
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Referer": "http://127.0.0.1:8090/recruit.students/login/view",
}
# URL參數
payload = {'account': 'admin','pwd':'660B8D2D5359FF6F94F8D3345698F88C'}
# 發送get請求
response = requests.get(url,headers = headers,params=payload)
# 查看響應內容,response.text 返回的是Unicode格式的數據
html=response.text
#創建 Beautiful Soup 對象
soup = BeautifulSoup(html,"lxml")
# 獲取“退出登錄”文本
info =soup.select('.toprighthref')[0].get_text()
#斷言,檢查客戶端發送get請求結果是否符合預期。
try:
assert info == "退出登錄"
print('-----pass------')
except ValueError:
print("----fail-----")
運行結果:
這裡獲取html的文本信息,只是使用前面介紹的BeautifulSoup,大家可以試試用正則表達式或者XPath試試。
備註:http請求的端口,儘量不要用相應的狀態碼(response.status_code)作為斷言,例如:狀態碼(200),就認為是用例成功,現實中,很多請求,狀態碼返回 200,實際上是請求失敗的。所以用來做斷言的條件要準確和唯一。
17.4 接口測試用例的設計
Web接口測試其實可以等同於功能測試,只是被測對象是接口,無界面交互而已;所以用例設計的方法是通用的。
常用的測試方法如下:
1、等價類劃分法
2、邊界值分析
3、因果圖判定法
4、場景分析法
17.4.1接口測試用例設計關注點
1、接口的協議類型(http還是https…)。
2、 接口請求的方法(get/post…)。
3、 參數是否必填。
4、參數間是否存在關聯。
5、參數取值範圍。
6、業務規則。
17.4.2接口測試用例設計思路
1) 優先級--針對所有接口。
1、暴露在外面的接口,因為通常該接口會給第三方調用。
2、供系統內部調用的核心功能接口。
3、供系統內部調用非核心功能接口。
2) 優先級--針對單個接口。
1、正向用例優先測試,逆向用例次之(通常情況,非絕對)。
2、是否滿足前提條件 > 是否攜帶默認參值參數 > 參數是否必填 > 參數之間是否存在關聯 > 參數數據類型限制 >參數數據類型自身的數據範圍值限制。
17.4.3接口測試用例設計分析
通常,設計接口測試用例需要考慮以下幾個方面:
1、是否滿足前提條件
有些接口需要滿足前置條件,才可成功獲取數據。常見的,需要登陸Token。
逆向用例:
針對是否滿足前置條件(假設為n個條件),設計0~n條用例。
2、是否攜帶默認值參數。
正向用例:
帶默認值的參數都不填寫、不傳參,必填參數都填寫正確且存在的“常規”值,其它不填寫,設計1條用例。
3、業務規則、功能需求。
這裡根據實際情況,結合接口參數說明,可能需要設計n條正向用例和逆向用例
4、參數是否必填。
逆向用例:
針對每個必填參數,都設計1條參數值為空的逆向用例。
5、參數之間是否存在關聯。
有些參數彼此之間存在相互制約的關係。
逆向用例:
根據實際情況,可能需要設計0~n條用例。
6、參數數據類型限制。
逆向用例:
針對每個參數都設計1條參數值類型不符的逆向用例。
7、參數數據類型自身的數據範圍值限制。
正向用例:
針對所有參數,設計1條每個參數的參數值在數據範圍內為最大值的正向用例。
逆向用例:
針對每個參數(假設n個),設計n條每個參數的參數值都超出數據範圍最大值的逆向用例。
針對每個參數(假設n個),設計n條每個參數的參數值都小於數據範圍最小值的逆向用例。
以上幾個方面考慮全的話,基本可以做到如下幾個方面的覆蓋:
主流程測試用例:正常的主流程功能校驗。
分支流測試用例:正常的分支流功能校驗。
異常流測試用例:異常容錯校驗。
17.4.4接口測試用例設計模板
備註:模板會分享到網盤,大家可以從網盤上下載。
17.5 教育局招生管理系統-接口測試用例
17.5.1測試用例1-新增學校
用例步驟:
1、登錄教育局招生管理系統
2、新建學校(學校名稱:tschool;學校類型:小學;錄取學生權限:勾選;備註:create a new school)
3、填寫完成,點提交。
通過fiddler抓包。
我們可以收集到接口的相關信息:
【請求方法】:POST
【URL】: http://127.0.0.1:8090/recruit.students/school/manage/addSchoolInfo
【headers】:
{"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Referer": "http://127.0.0.1:8090/recruit.students/school/manage/index",}
【data】:
{"schoolName":"t_school",
"listSchoolType[0].id": "2",
"canRecruit":"" 1,
"remark":"create a new school",}
學校創建成功之後,我們可以通過學校列查看新建的數據。
學校列表是另外個接口:http://127.0.0.1:8090/recruit.students/school/manage/schoolInfoList
經過分析,我們就可以寫接口測試用例了。
程序實現:
import requests
import json
from urllib import parse
# 第一步:登錄教育局招生管理系統
url_login="http://127.0.0.1:8090/recruit.students/login/in?account=admin&pwd=660B8D2D5359FF6F94F8D3345698F88C"
#把請求頭信息進行處理,去掉一些沒用的,保留一些有用頭信息
headers = {
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Referer": "http://127.0.0.1:8090/recruit.students/login/view",
}
# 發送get請求
response = requests.get(url_login ,headers = headers)
# 第一步:登錄教育局招生管理系統
url_login="http://127.0.0.1:8090/recruit.students/login/in?account=admin&pwd=660B8D2D5359FF6F94F8D3345698F88C"
#把請求頭信息進行處理,去掉一些沒用的,保留一些有用頭信息·
headers1 = {
"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Referer": "http://127.0.0.1:8090/recruit.students/login/view",
}
# 發送get請求
r1 = requests.get(url_login,headers = headers1)
#print(r1.text)
# 新建學校
url_create_school="http://127.0.0.1:8090/recruit.students/school/manage/addSchoolInfo"
#把請求頭信息進行處理,去掉一些沒用的,保留一些有用頭信息·
headers2 = {"Connection": "keep-alive",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Referer": "http://127.0.0.1:8090/recruit.students/school/manage/index",
"X-Requested-With": "XMLHttpRequest",
"Cookie": "JSESSIONID=09CD90A3357DEBD4F3B0F2CF3B387DCA",
}
formdata = {
"schoolName":"t_school2",
"listSchoolType[0][id]":"2",
"canRecruit":"1",
"remark":"create a new school_2",
}
# 通過urlencode()轉碼
postdata = parse.urlencode(formdata)
print(postdata)
# 創建session對象,可以保存Cookie值。
ssion = requests.session()
# 發送附帶用戶名和密碼的請求,並獲取登錄後的Cookie值,保存在ssion裡。
r2 = ssion.post(url_create_school,headers = headers2,data=postdata)
html = r2.text
print(html)
# 查看響應碼
print(r2.status_code)
運行結果:
閱讀更多 聽海8 的文章