目錄
- 1、什么是接口?
- 2、如何開展接口測試?
- 3、如何設(shè)計(jì)接口用例?
- 1.獲取接口文檔
- 2.分析接口文檔的接口,提取測試點(diǎn)
- 3.接口測試用例設(shè)計(jì)思路
- 4.接口測試其他范圍
- 接口業(yè)務(wù)測試
- 接口的性能測試
- 接口安全測試
- 在項(xiàng)目下新建一個文件夾common
- 編寫登錄接口用例,調(diào)用封裝的請求類。
- 對于用例的一些總結(jié):
- 4、接口測試用例實(shí)戰(zhàn)
在上一篇Python接口自動化測試系列文章:Python接口自動化淺析unittest單元測試原理,主要介紹單元測試,unittest模塊特性、大致流程、源碼及實(shí)戰(zhàn)例子。
以下主要介紹接口概念、接口用例設(shè)計(jì)及登錄接口測試實(shí)戰(zhàn)。
1、什么是接口?
接口:檢測外部系統(tǒng)與系統(tǒng)之間以及內(nèi)部各個子系統(tǒng)之間的交互點(diǎn)。
通俗來說,接口就是連接前后端的橋梁,接口測試可以簡單理解為脫離了前端的功能測試。
一個又一個的接口就對應(yīng)功能測試內(nèi)一個又一個的功能。
但注意,一個功能有可能不是一個接口就能實(shí)現(xiàn)。
那么,接口測試和功能測試的區(qū)別在哪呢?
其實(shí)功能測試就是在頁面上輸入我們的參數(shù)值,點(diǎn)點(diǎn)點(diǎn);
而接口測試沒有前端,而是通過接口文檔上的調(diào)用地址、請求參數(shù)等,校驗(yàn)返回的結(jié)果值,
也就是說,接口可以看成沒有界面的功能測試。
因此,可以分析,系統(tǒng)間的接口包含三部分:輸入、處理邏輯、輸出。
2、如何開展接口測試?
接口測試流程如下:
1.需求評審,熟悉業(yè)務(wù)和需求;
2.開發(fā)提供API接口文檔;
3.根據(jù)開發(fā)交付的接口文檔,編寫接口測試用例;
4.接口測試用例評審;
5.開始執(zhí)行接口測試;
6.提交測試報(bào)告;
3、如何設(shè)計(jì)接口用例?
1.獲取接口文檔
一般公司的開發(fā)會提供接口文檔,沒有接口文檔的自行抓包吧(摸摸頭),不知道怎么抓包的小伙伴,可以看看之前的Fiddler系列文章。
Fiddler
接口文檔是我們測試時最重要的一個依據(jù),一個規(guī)范的接口文檔至少包括:
1.接口說明;
2.調(diào)用URL;
3.請求方法(get、post等);
4.請求參數(shù)、參數(shù)類型、請求參數(shù)說明等;
5.返回參數(shù)說明;
如下為一個簡單的登錄接口文檔:
2.分析接口文檔的接口,提取測試點(diǎn)
接口測試用例跟常規(guī)的功能測試用例基本一樣,
可以從接口功能測試、接口業(yè)務(wù)測試、接口性能測試、接口安全測試等角度考慮。
接口的邏輯校驗(yàn),可以參照接口流程圖來進(jìn)行設(shè)計(jì),一個分支需要作為一個場景去進(jìn)行測試,需要覆蓋到流程圖里面所有的邏輯分支。
接口的參數(shù)校驗(yàn),可以參照接口文檔中的參數(shù)定義去進(jìn)行驗(yàn)證,需要覆蓋到所有參數(shù)對應(yīng)的枚舉值以及錯誤碼等信息。
3.接口測試用例設(shè)計(jì)思路
接口功能的關(guān)注點(diǎn)是:
1.接口參數(shù)正確與否:接口傳入的參數(shù)是否有正確填寫;
2.接口參數(shù)缺失:接口參數(shù)有必填、選填參數(shù),傳參時,測試參數(shù)缺失對結(jié)果的影響;
3.接口參數(shù)邊界值:比如用戶名、密碼有長度限制,需要測試不同長度的參數(shù)對結(jié)果的影響;
4.接口參數(shù)類型:比如接口文檔中用戶名為String類型,測試傳入其他數(shù)據(jù)類型對結(jié)果的影響。
4.接口測試其他范圍
接口業(yè)務(wù)測試
主要是從業(yè)務(wù)的角度出發(fā),把接口組合成一條業(yè)務(wù)鏈,比如登錄之后充值,在數(shù)據(jù)庫中金額是否正確等等
接口的性能測試
是指接口是否滿足業(yè)務(wù)的要求,比如業(yè)務(wù)要求系統(tǒng)可以滿足50個人同時下單,那么下單這個接口就要可以承擔(dān)50 TPS,目前業(yè)內(nèi)一般使用JMETER去做接口性能測試,jmeter接口性能后續(xù)會單獨(dú)在Jmeter系列文章里介紹。
接口安全測試
接口的安全性主要圍繞Token、Timestamp和Sign三個機(jī)制展開設(shè)計(jì),保證接口的數(shù)據(jù)不會被篡改和重復(fù)調(diào)用。
注意:本文主要涉及接口功能測試,相信做過功能測試的童鞋,設(shè)計(jì)接口測試用例也是沒問題的。
4、接口測試用例實(shí)戰(zhàn)
以下,我們以登錄接口進(jìn)行實(shí)戰(zhàn)。
隨著代碼模塊越來越多,混在一起,雜亂無章,這時我們考慮架構(gòu)分層了,上篇文章:Python接口自動化之requests請求封裝,封裝的requests請求類,每個用例都要調(diào)用,可以放在公共模塊里。
在項(xiàng)目下新建一個文件夾common
放入請求模塊requests_handler.py
requests_handler.py
import requests
class RequestsHandler:
def __init__(self):
"""session管理器"""
self.session = requests.session()
def visit(self, method, url, params = None, data= None, json= None, headers= None):
result = self.session.request(method,url,params=params,data=data,json=json,headers=headers)
try:
# 返回json結(jié)果
return result.json()
except Exception:
return 'not json'
def close_session(self):
self.session.close()
編寫登錄接口用例,調(diào)用封裝的請求類。
登錄用例,新建一個test_cases文件夾,用來存放用例模塊。
test_Login.py
import unittest
from common.requests_handler import RequestsHandler
class LoginTest(unittest.TestCase):
def setUp(self):
# 請求類實(shí)例化
self.req = RequestsHandler()
def tearDown(self):
self.req.close_session()
def test_login_success(self):
login_url = 'http://127.0.0.1:8000/user/login'
payload = {
"mobile_phone": "1530272****",
"pwd": "12345678"
}
res = self.req.visit('post',login_url,json=payload)
self.assertEqual(0, res['code'])
if __name__ == '__main__':
unittest.main()
運(yùn)行結(jié)果為:
Ran 1 test in 0.213s
OK
對于用例的一些總結(jié):
setUp, tearDown
前置條件,后置條件,setUp實(shí)例化,在運(yùn)行測試用例前獲取session管理器, tearDown,在測試用例執(zhí)行結(jié)束后關(guān)閉session管理器。
對于斷言
小伙伴們可能不知道到底用返回結(jié)果中的哪個字段斷言。個人意見,如果code、msg比較詳細(xì)的話,可以利用code、msg其中一個來斷言,當(dāng)然code、msg一起做斷言也可以,甚至你覺得返回結(jié)果中某個數(shù)據(jù)符合你的預(yù)期,也是可以拿來斷言,斷言手段是靈活多變的,自行選擇最優(yōu)方案。
小伙伴們看到總結(jié),退出微信,打開王者榮耀,一氣呵成,其實(shí)還沒完呢,我們寫了正向用例,還有異常用例也寫兩條,更多的異常用例可以自行擴(kuò)展下。
import unittest
from common.requests_handler import RequestsHandler
class LoginTest(unittest.TestCase):
def setUp(self):
# 請求類實(shí)例化
self.req = RequestsHandler()
def tearDown(self):
# 關(guān)閉session
self.req.close_session()
def test_login_success(self):
"""
正確手機(jī)號,正確密碼
"""
login_url = 'http://127.0.0.1:8000/user/login'
payload = {
"mobile_phone": "1530272****",
"pwd": "12345678"
}
res = self.req.visit('post',login_url,json=payload)
# 根據(jù)請求結(jié)果中的code進(jìn)行斷言
self.assertEqual(0, res['code'])
def test_phone_is_null(self):
"""
手機(jī)號為空,密碼正確
"""
login_url = 'http://127.0.0.1:8000/user/login'
payload = {
"mobile_phone": "",
"pwd": "12345678"
}
res = self.req.visit('post', login_url, json=payload)
# 根據(jù)返回結(jié)果中的msg進(jìn)行斷言
self.assertEqual("手機(jī)號碼為空", res['msg'])
def test_pwd_is_null(self):
"""
正確用戶名,密碼為空
"""
login_url = 'http://127.0.0.1:8000/user/login'
payload = {
"mobile_phone": "1530272****",
"pwd": ""
}
res = self.req.visit('post', login_url, json=payload)
# 根據(jù)返回結(jié)果中的msg進(jìn)行斷言
self.assertEqual("密碼為空", res['msg'])
if __name__ == '__main__':
unittest.main()
測試結(jié)果為:
Ran 3 tests in 0.259s
OK
以上代碼如下痛點(diǎn):
- 用例和數(shù)據(jù)未分離,維護(hù)成本大??梢詳?shù)據(jù)與測試腳本分離,使用Excel存放測試用例,方便維護(hù)。
- 仔細(xì)研究發(fā)現(xiàn)正向用例、異常用例,只是傳入的數(shù)據(jù)不一樣,其他都是通用
這種情況下,我們可以引入ddt數(shù)據(jù)驅(qū)動,減少代碼量。
到此這篇關(guān)于Python接口自動化淺析登錄接口測試實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Python接口自動化登錄接口測試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Python接口自動化淺析數(shù)據(jù)驅(qū)動原理
- Python接口自動化淺析unittest單元測試原理
- python使用pytest接口自動化測試的使用
- python+requests+pytest接口自動化的實(shí)現(xiàn)示例
- python接口自動化測試數(shù)據(jù)和代碼分離解析