「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

「第十七章」 Python3 接口項目實戰一(WEB項目)

17.1 接口測試項目搭建

17.1.1 教育局招生管理系統部署

教育局招生管理系統是基於java+mysql,下面介紹它的部署過程。

1.從我的網盤下載部署文件。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

2.安裝jdk以及配置環境變量。

點擊文件進行安裝。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

安裝文件

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

下一步下一步直接安裝。

本人的安裝路徑是 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,按回車出現以下畫面。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

3.解壓 apache-tomcat-7.0.42 壓縮包,把 recruit.students.war 包放到E:\\apache-tomcat-7.0.42\\webapps 下。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

4. 點擊 安裝mysql 服務端。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

設置mysql賬戶和密碼: root /root

默認下一步下一步安裝完成。

5.用mysql 客戶端工具 navicat 連接mysql ->新建一個recruit_students 庫。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

6.把 recruit_students_sql 數據文件導入到新建的庫中。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

7.導完之後,會看到如下圖一些表。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

8.修改war包下的數據庫配置文件:datasource.properties。

E:\\apache-tomcat-7.0.42\\webapps\\recruit.students\\WEB-INF\\classes 下。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

配置jdbc的URL。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

9.mysql 數據庫用戶訪問授權。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

commit;

10.點擊E:\\apache-tomcat-7.0.42\\bin下的startup 啟動tomcat.

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

11.訪問教育局招生系統。

訪問地址:http://127.0.0.1:8090/recruit.students/login/view。

初始賬戶和密碼: admin /test123

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

備註:tomcat默認的端口是8080,我用的是8090,是因為修改了tomcat的端口。

17.1.2教育局招生管理系統的功能清單

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

17.2 項目第一個接口測試用例

教育局招生管理系統登錄接口用例實現步驟:

1、打開抓包工具:fiddler。

2、登錄教育局招生管理系統。

3、抓取登錄http請求。

4、分析登錄http請求(請求地址、是否重定向、get請求還是post請求、請求的頭信息、請求的response)。

5、數據的處理(處理抓取到的頭信息)

6、編寫接口代碼。

7、人工驗證接口測試結果。(後續講斷言)

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

第一步:下面對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。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

查看http://127.0.0.1:8090/recruit.students/school/manage/index 這個地址請求的response,返回的是登陸後的信息。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

通過分析,我們是清楚的瞭解到這個接口的情況。

第二步:接著還需要請求頭信息的處理,去掉一些沒用的請求頭信息,保留如下:

"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)

運行結果:

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

方式二:帶參數的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)

運行結果:

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

方式三:data=payload 的Post請求。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

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)

運行結果:

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

這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 地址,跟我們通過抓包的結果是一樣的。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

第四步:驗證結果。

通過程序運行的結果和抓包的結果對比,驗證通過。

17.3 測試用例斷言

接口用例的斷言設計,客戶端需要發送了http請求,服務端返回 response(html內容),就需要我們考慮提取html內容裡的元素作為用例的檢查點,例如

教育局招生管理系統登錄接口用例登錄成功後,我們可以設置斷言看是否可以從服務端返回 response(html內容)中獲取“退出登錄”文本。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

第一步:首先,我們先發送請求,獲取服務端返回 response(html內容)進行分析。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

為了更進一步確認,可以把返回的html內容拷貝到 EditPlus 3 下查看。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

第二步,編寫代碼,進行斷言判斷。

程序實現:

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-----")

運行結果:

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

這裡獲取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接口測試用例設計模板

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

備註:模板會分享到網盤,大家可以從網盤上下載。

17.5 教育局招生管理系統-接口測試用例

17.5.1測試用例1-新增學校

用例步驟:

1、登錄教育局招生管理系統

2、新建學校(學校名稱:tschool;學校類型:小學;錄取學生權限:勾選;備註:create a new school)

3、填寫完成,點提交。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

通過fiddler抓包。

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

我們可以收集到接口的相關信息:

【請求方法】: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

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)

經過分析,我們就可以寫接口測試用例了。

程序實現:

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)

運行結果:

「手把手教python3接口自動化」 : Python3 接口項目實戰(一)


分享到:


相關文章: