在上一篇python接口自動化測試系列文章:python接口自動化淺析unittest單元測試原理,主要介紹單元測試,unittest模塊特性、大致流程、源碼及實戰例子。
以下主要介紹接口概念、接口用例設計及登錄接口測試實戰。
1、什么是接口?
接口:檢測外部系統與系統之間以及內部各個子系統之間的交互點。
通俗來說,接口就是連接前后端的橋梁,接口測試可以簡單理解為脫離了前端的功能測試。
一個又一個的接口就對應功能測試內一個又一個的功能。
但注意,一個功能有可能不是一個接口就能實現。
那么,接口測試和功能測試的區別在哪呢?
其實功能測試就是在頁面上輸入我們的參數值,點點點;
而接口測試沒有前端,而是通過接口文檔上的調用地址、請求參數等,校驗返回的結果值,
也就是說,接口可以看成沒有界面的功能測試。
因此,可以分析,系統間的接口包含三部分:輸入、處理邏輯、輸出。
2、如何開展接口測試?
接口測試流程如下:
1.需求評審,熟悉業務和需求;
2.開發提供api接口文檔;
3.根據開發交付的接口文檔,編寫接口測試用例;
4.接口測試用例評審;
5.開始執行接口測試;
6.提交測試報告;
3、如何設計接口用例?
1.獲取接口文檔
一般公司的開發會提供接口文檔,沒有接口文檔的自行抓包吧(摸摸頭),不知道怎么抓包的小伙伴,可以看看之前的fiddler系列文章。
fiddler
接口文檔是我們測試時最重要的一個依據,一個規范的接口文檔至少包括:
1.接口說明;
2.調用url;
3.請求方法(get、post等);
4.請求參數、參數類型、請求參數說明等;
5.返回參數說明;
如下為一個簡單的登錄接口文檔:
2.分析接口文檔的接口,提取測試點
接口測試用例跟常規的功能測試用例基本一樣,
可以從接口功能測試、接口業務測試、接口性能測試、接口安全測試等角度考慮。
接口的邏輯校驗,可以參照接口流程圖來進行設計,一個分支需要作為一個場景去進行測試,需要覆蓋到流程圖里面所有的邏輯分支。
接口的參數校驗,可以參照接口文檔中的參數定義去進行驗證,需要覆蓋到所有參數對應的枚舉值以及錯誤碼等信息。
3.接口測試用例設計思路
接口功能的關注點是:
1.接口參數正確與否:接口傳入的參數是否有正確填寫;
2.接口參數缺失:接口參數有必填、選填參數,傳參時,測試參數缺失對結果的影響;
3.接口參數邊界值:比如用戶名、密碼有長度限制,需要測試不同長度的參數對結果的影響;
4.接口參數類型:比如接口文檔中用戶名為string類型,測試傳入其他數據類型對結果的影響。
4.接口測試其他范圍
接口業務測試
主要是從業務的角度出發,把接口組合成一條業務鏈,比如登錄之后充值,在數據庫中金額是否正確等等
接口的性能測試
是指接口是否滿足業務的要求,比如業務要求系統可以滿足50個人同時下單,那么下單這個接口就要可以承擔50 tps,目前業內一般使用jmeter去做接口性能測試,jmeter接口性能后續會單獨在jmeter系列文章里介紹。
接口安全測試
接口的安全性主要圍繞token、timestamp和sign三個機制展開設計,保證接口的數據不會被篡改和重復調用。
注意:本文主要涉及接口功能測試,相信做過功能測試的童鞋,設計接口測試用例也是沒問題的。
4、接口測試用例實戰
以下,我們以登錄接口進行實戰。
隨著代碼模塊越來越多,混在一起,雜亂無章,這時我們考慮架構分層了,上篇文章:python接口自動化之requests請求封裝,封裝的requests請求類,每個用例都要調用,可以放在公共模塊里。
在項目下新建一個文件夾common
放入請求模塊requests_handler.py
requests_handler.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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結果 return result.json() except exception: return 'not json' def close_session( self ): self .session.close() |
編寫登錄接口用例,調用封裝的請求類。
登錄用例,新建一個test_cases文件夾,用來存放用例模塊。
test_login.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import unittest from common.requests_handler import requestshandler class logintest(unittest.testcase): def setup( self ): # 請求類實例化 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() |
運行結果為:
ran 1 test in 0.213s
ok
對于用例的一些總結:
setup, teardown
前置條件,后置條件,setup實例化,在運行測試用例前獲取session管理器, teardown,在測試用例執行結束后關閉session管理器。
對于斷言
小伙伴們可能不知道到底用返回結果中的哪個字段斷言。個人意見,如果code、msg比較詳細的話,可以利用code、msg其中一個來斷言,當然code、msg一起做斷言也可以,甚至你覺得返回結果中某個數據符合你的預期,也是可以拿來斷言,斷言手段是靈活多變的,自行選擇最優方案。
小伙伴們看到總結,退出微信,打開王者榮耀,一氣呵成,其實還沒完呢,我們寫了正向用例,還有異常用例也寫兩條,更多的異常用例可以自行擴展下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
import unittest from common.requests_handler import requestshandler class logintest(unittest.testcase): def setup( self ): # 請求類實例化 self .req = requestshandler() def teardown( self ): # 關閉session 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) # 根據請求結果中的code進行斷言 self .assertequal( 0 , res[ 'code' ]) def test_phone_is_null( self ): """ 手機號為空,密碼正確 """ login_url = 'http://127.0.0.1:8000/user/login' payload = { "mobile_phone" : "", "pwd" : "12345678" } res = self .req.visit( 'post' , login_url, json = payload) # 根據返回結果中的msg進行斷言 self .assertequal( "手機號碼為空" , 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) # 根據返回結果中的msg進行斷言 self .assertequal( "密碼為空" , res[ 'msg' ]) if __name__ = = '__main__' : unittest.main() |
測試結果為:
ran 3 tests in 0.259s
ok
以上代碼如下痛點:
- 用例和數據未分離,維護成本大。可以數據與測試腳本分離,使用excel存放測試用例,方便維護。
-
仔細研究發現正向用例、異常用例,只是傳入的數據不一樣,其他都是通用
這種情況下,我們可以引入ddt數據驅動,減少代碼量。
到此這篇關于python接口自動化淺析登錄接口測試實戰的文章就介紹到這了,更多相關python接口自動化登錄接口測試內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/ZangKang1/article/details/119426771