一.在咱們沒有學習過python語言的時候領導讓咱們作接口測試 咱們都使用工具來作測試,通常經常使用的如jemeter,postman這些個工具,我來推薦使用postmanpython
這個工具來進行接口測試,有的小夥伴們說Fiddler或Charles抓接口,而後進行測試不也成嗎?成是成,可是接口測試每每優先於客戶端測試而且postman這個工具方便用來模擬異常請求,而且postman這個工具還帶有驗證功能,提升咱們接口測試的效率mysql
咱們來用postman來進行一個簡單的自動化ios
1.發送一個get請求sql
2.發送一個post請求數據庫
3.設置檢查點,檢驗請求的返回值json
驗證包含哪些內容api
postman斷言是JavaScript語言編寫的,在postman客戶端指定區域編寫便可。cookie
clear a global variable | 清除全局變量 | pm.globals.unset("variable_key"); |
Clear an environment variable | 清除一個環境變量 | pm.environment.unset("variable_key"); |
get a global variable | 獲得一個全局變量 | pm.globals.get("variable_key"); |
get a variable | 獲得一個變量 | pm.variables.get("variable_key"); |
Get an environment variable | 獲得一個環境變量 | pm.environment.get("variable_key"); |
response body:contains string | 檢查response body包含字符串 | pm.test("Body matches string", function () { pm.expect(pm.response.text()).to.include("string_you_want_to_search"); }); |
response body:convert XML body to a JSON object | response body:將XML轉換爲JSON對象 | var jsonObject = xml2Json(responseBody); |
response body:is equal to a string | 檢查響應體等於一個字符串 | pm.test("Body is correct", function () { pm.response.to.have.body("response_body_string"); }); |
response body:JSON value check | 檢查response body中JSON某字段值 | pm.test("Your test name", function () { var jsonData = pm.response.json(); pm.expect(jsonData.value).to.eql(100); }); |
response headers:content-Type header check | 檢查content-Type是否包含在header返回 | pm.test("Content-Type is present", function () { pm.response.to.have.header("Content-Type"); }); |
response time is than 200ms | 響應時間超過200ms | pm.test("Response time is less than 200ms", function () { pm.expect(pm.response.responseTime).to.be.below(200); }); |
send s request | 發送一個請求 | pm.sendRequest("https://postman-echo.com/get", function (err, response) { console.log(resp onse.json()); }); |
set a global variable | 設置一個全局變量 | pm.globals.set("variable_key", "variable_value"); |
set an environment variable | 設置一個環境變量 | pm.environment.set("variable_key", "variable_value"); |
status code:Code is 200 | 狀態碼:代碼是200 | pm.test("Status code is 200", function () { pm.response.to.have.status(200); }); |
status code:code name has string | 狀態碼:代碼中有指定字符串 | pm.test("Status code name has string", function () { pm.response.to.have.status("Created"); }); |
status code:successful POST request | 狀態碼:成功的post請求 | pm.test("Successful POST request", function () { pm.expect(pm.response.code).to.be.oneOf([201,202]); }); |
use tiny validator for JSON data | 爲json數據使用tiny驗證器 | var schema = { "items": { "type": "boolean" } }; var data1 = [true, false]; var data2 = [true, 123]; pm.test('Schema is valid', function() { pm.expect(tv4.validate(data1, schema)).to.be.true; pm.expect(tv4.validate(data2, schema)).to.be.true; }); |
有時須要在不一樣的環境下跑相同的測試,此時能夠經過設置環境變量來動態選擇。點擊右上角的設置按鈕:session
填寫該環境的名稱:如測試環境,並在key和value中填寫須要的鍵值框架
使用這些鍵值的時候只須要加上兩個花括號引用key
1 {{base_url}}/username
解析完後
創建多個環境時,key一般都是相同的,只是value不一樣
點擊這個位置來新增環境變量
建立好全部環境後,在跑用例的時候在右上角下拉列表選擇須要的環境就好
二。請求
postman界面分爲兩部分:左邊的sidebar 右邊的request builder:快速建立幾乎全部的請求
建立一個集合
1.GET請求參數及header
2.POST請求設置(重要)
能夠上傳一個文件做爲key的value提交(如上傳文件)。但該文件不會做爲歷史保存,只能在每次須要發送請求的時候,從新添加文件。
同前面同樣,注意,你不能上傳文件經過這個編碼模式。
該模式和表單模式會容易混淆。urlencoded中的key-value會寫入URL,form-data模式的key-value不明顯寫入URL,而是直接提交。
raw request能夠包含任何東西。全部填寫的text都會隨着請求發送。
圖片,音頻,視頻,文件均可以 。 也不能保存歷史,每次選擇文件,提交。
保證API響應的正確性,就是你須要作的大部分工做。postman的response viewer部分會協助你完成該工做且使其變得簡單。
一個API的響應包含body,headers,響應狀態碼。postman將body和headers放在不一樣的tabs中。響應碼和響應時間顯示在tabs的旁邊。將鼠標懸停在響應碼上面能夠查看更詳細的信息。
Postman的Tests標籤能夠用來寫測試:
postman容許你運行collection,你能夠運行任意的次數。 最後會給出一個總體運行的結果。會保存每一次運行的結果,提供給你比較每一次運行結果的不一樣。
選擇collection,選擇環境。點擊運行按鈕。
這就是postman給咱們帶來的好處,他能夠收集全部接口請求,進行結果斷言,在咱們須要的時候他能夠成批的進行運行。
可是postman的缺點也是十分明顯的,他是一個固定的工具,只能知足一部分接口請求的要求,可是有不少接口的請求參數需求他就沒法實現了,好比說在請求參數了須要時間戳,須要一個MD5加密的字段,須要從數據庫裏查詢一個id鍵值,再好比說須要獲取返回中的參數這些都沒法實現,只能經過手動去獲取,那這樣自動化的意義也就不存在了,因此最靠譜的實現自動化仍是須要使用python來開發一個腳本,按照接口文檔的要求開發出相應的接口請求腳本。
二.當咱們學習過python中的request模塊咱們能夠發送接口請求,發送get,post,put,delete等請求,同時能夠發送字典格式的,json格式的,發送文件等類型數據,也能夠操做session,cookie,並對接口返回進行操做,如獲取返回內容,並對返回內容格式化,獲取返回的狀態碼,獲取請求時間等功能呢。
下面 咱們就用request的模塊進行一個簡單的接口測試
#導入requests模塊
import requests
def test(url,data,check_key,check_value):
rep=requests.post(url=url,data=data).json()
print(rep)
assertion=rep[check_key]
if assertion == check_value:
print("豆瓣發佈接口測試經過")
else:
print("豆瓣發佈接口測試不經過")
test('https://api.douban.com/shuo/statuses/',"{'media': [{'imgsrc': 'http://icanhascheezburger.files.wordpress.com/2009/04/funny-pictures-hairless-cat-phones- home.jpg', 'src': 'http://www.mapsofwar.com/photos/EMPIRE17.swf', 'type': 'flash'}]}", \
'msg','須要登陸')
結果以下:
咱們的入參須要一個時間戳而且須要一個數據庫字段
#導入requests模塊
import requests
import pymysql
import time
def test():
# 獲取13位時間戳
millis = int(round(time.time() * 1000))
print("時間戳:%s"%millis)
# 建立鏈接
conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='root123', db='autotest',charset='utf8')
# 建立遊標
cursor = conn.cursor()
# 執行SQL,並返回受影響行數
cursor.execute("select * from autotest_input WHERE id=1")
results = cursor.fetchall()
print(results)
print(results[0][1])
# 提交,否則沒法保存新建或者修改的數據
conn.commit()
# 關閉遊標
cursor.close()
# 關閉鏈接
conn.close()
url = 'http://ios.wecash.net/biz/wallet/amount'
data = 'CUSTOMER_ID=56256A951F81F0BCA10780AD02139B29'
rep = requests.get(url=url, data=data).json()
print(rep)
errorDescription = rep['errorDescription']
if errorDescription == '查詢成功':
print("紅包查詢接口測試經過")
else:
print("紅包查詢接口測試不經過")
test()
結果以下:
咱們能夠看到由於每個接口的請求方式都是不同的,傳參也不同,返回結果的校驗字段與校驗值也是不同的,因此咱們須要一個接口請求寫一個方法,這樣作好處是清晰方便,便於代碼檢查,但缺點也一樣是異常明顯的。首先代碼冗餘,重複性代碼過多,不便於維護並且咱們作接口測試,不能只是把接口測通就算經過了,咱們還須要進行接口的正反用例,對接口進行邊界值測試,傳參類型測試,傳參合法性測試等等,那就須要咱們頻繁的修改傳參和斷言字段與斷言字段值,並且咱們進行結果斷言的時候不能只是用等於來進行校驗,由於有的返回字段咱們須要對他的類型就行校驗,返回的結果的範圍進行校驗,因此咱們要寫多個斷言判斷的方法,這麼來看 接口測試用代碼來實現 還真不是那麼簡簡單單 so easy的事啊!!!
咱們僅僅用requests模塊進行簡單的接口測試是行得通的,可是要只有requests模塊給整個公司上百個接口進行測試的話顯然這是很難實現地,那麼有沒有一個更好的方法或者說有一個現成的框架供咱們使用呢?答案當時是有的,這就是unittest框架,今天咱們來介紹一下他
三。unittest框架簡介
unittest單元測試框架不只能夠適用於單元測試和接口自動化測試用例的開發與執行,還能夠適用WEB自動化測試用例的開發與執行,該測試框架可組織執行測試用例,而且提供了豐富的斷言方法,判斷測試用例是否經過,最終生成HTML格式的測試結果,便於查看,這麼看來unittest框架簡直就是自動化測試人員必須掌握的技能之一。