python+requests+unittest API接口測試

點點在網上查找了下接口測試相關的資料,大都重點是以數據驅動的形式,將用例維護在文本或表格中,而沒有說明怎麼樣去生成想要的用例,python

問題:程序員

測試接口時,好比參數a,b,c,我要先測a參數,有(不傳,爲空,整形,浮點,字符串,object,太短,超長,sql注入)這些狀況,其中一種狀況就是一條用例,同時要保證b,c的正確,確保a的測試不受b,c參數的錯誤影響sql

解決思路:api

符合接口規範的參數能夠手動去填寫,或者準備在代碼庫中。那些不符合規範的參數(不傳,爲空,整形,浮點,字符串,object,太短,超長,sql注入)也能夠準備在庫中做爲常量反覆使用app

主要實現的功能點:框架

1.api參數整理到dict中,方便組合參數生成用例工具

2.對生成的用例進行循環執行源碼分析

3.封裝些許代碼便於使用和維護post

 

源碼分析:測試

canshuxinxi.py文件用來存放api接口信息。以dict形式存放,這樣就能夠API_ALL['登陸接口'][url]這種方式去取,看起來較直觀,知道取得是哪一個接口的那部分信息。

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # @Time    : 2017-06-09 14:09
 4 # canshuxinxi.py
 5 
 6 # 接口信息
 7 API_ALL = {
 8             '登陸接口': {
 9                             'number': '1',
10                             'url': 'http://www.baidu.com',
11                             'leixing': 'post',
12                             'head': {
13                                         'aa': 'bb',
14                                         'cc': 'dd',
15                                         },
16                             'canshu': {
17                                         'username': 'Wbfxs001',
18                                         'password': '111111Qq',
19                                         'grant_type': 'password',
20                                     },
21                             'qiwang': {
22                                         'code': 200,
23                                         'name': 'Wbfxs001',
24                                         },
25                         },
26 
27             '退出接口': {
28                             'number': '1',
29                             'url': 'http://www.baidu.com',
30                             'leixing': 'get',
31                             'canshu': {
32                                         'username': 'Wbfxs001',
33                                         'password': '111111Qq',
34                                         'grant_type': 'password',
35                                       }
36             }
37 }

 

changliang.py文件用來存很是規(可能會讓接口響應異常)參數,同理也是存放在dict中,方便維護,好比之後要加新的sql注入代碼段,能夠直接在後面添加

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # @Time    : 2017-06-09 14:09
 4 # changliang.py
 5 
 6 # 經常使用參數不傳,爲空,整形,浮點,字符串,object,太短,超長,sql注入
 7 objects1 = 'xxxx'
 8 objects2 = 'ssss'
 9 
10 ZHCS = {
11             '爲空': [''],
12             '整形': [10, 23, 44, 88, 99],
13             '浮點': [1.11, 2.342, -1.03],
14             '字符串': ['aaaa', 'bbbb', 'cccc','dddd'],
15             'object': [objects1, objects2],
16             '太短': ['1', '0'],
17             '超長': ['11111111111111111111111111111111111111111111111'],
18             'sql注入': [';and 1=1 ;and 1=2', ";and (select count(*) from sysobjects)>0 mssql", ";and 1=(select IS_SRVROLEMEMBER('sysadmin'));--"],
19          }

 

 

# gongju.py做爲工具類,下面方法進行了封裝,方便調用。實現了對參數進行組合,生產不一樣組合的dict類型的參數,並將dict參數保存到list中,方便取用。
 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # @Time    : 2017-06-09 14:11
 4 # gongju.py
 5 
 6 # 生成不一樣組合的參數
 7 
 8 class gj():
 9 
10     def listalls(self, csTrue,  csFalse):
11         fzgcs = []  # 獲得cycanshu的key,將全部非正規參數放在一個list中
12         listall = []  # 保存參數dict 爲 list
13         zhcs = dict(csTrue)
14         listall.append(csTrue)
15         aaa = list(csFalse.keys())
16         for i in aaa:
17             bbb = csFalse[i]  # 獲得具體參數list
18             for k in bbb:
19                 fzgcs.append(k)  # 便利每個參數加入fzgcs列表
20 
21         zhcskey = list(zhcs.keys())  # 拿到將要進行組合的參數
22         for i in zhcskey:
23             a = zhcs[i]  # 保留原有的參數值,下面替換完後復原正確參數
24             for k in fzgcs:
25                 zhcs[i] = k
26                 listall.append(str(zhcs))
27             # 循環完後復原正確參數
28             zhcs[i] = a
29         return listall

 

 

jiaoben.py文件做爲腳本類,用來對組合好的參數進行循環執行,依次帶入組合參數請求。(只作了請求和打印響應信息,可再加入對響應結果斷言)
 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # @Time    : 2017-06-09 14:22
 4 # jiaoben.py
 5 
 6 from changliang import ZHCS
 7 from canshuxinxi import API_ALL
 8 from gongju import gj
 9 import requests
10 # 腳本類,組合工具參數進行請求
11 gj = gj()
12 def jball():
13     apikeys = API_ALL.keys()
14     print(apikeys)
15     for key in apikeys:
16         apiname = key
17         url = API_ALL[key]['url']
18         number = API_ALL[key]['number']
19         leixin = API_ALL[key]['leixing']
20         canshus = gj.listalls(API_ALL[key]['canshu'], ZHCS)
21         if leixin == 'post':
22             print("======="+" api名稱:"+apiname+"=======")
23             for cs in canshus:
24                 mp = requests.post(url=url, data=cs)
25                 fhcode = str(mp.status_code)
26                 xysj = str(mp.elapsed.microseconds)
27                 print("=響應=api編號:"+number+"  響應code:"+fhcode+"  響應時間:"+xysj)
28         if leixin == 'get':
29             print("======="+" api名稱:"+apiname+"=======")
30             for cs in canshus:
31                 mp = requests.get(url=url, data=cs)
32                 fhcode = str(mp.status_code)
33                 xysj = str(mp.elapsed.microseconds)
34                 print("=響應=api編號:"+number+"  響應code:"+fhcode+"  響應時間:"+xysj)
35 jball()

 

tesone.py文件做爲用例執行文件,熟悉unittest框架的都清楚其中的原理,就不作多介紹,黑熊主要用來控制腳本的執行,結合了unittest框架後,方便後續的擴展。
 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # @Time    : 2017-06-09 8:53
 4 # tesone.py
 5 
 6 import requests
 7 import unittest
 8 import time
 9 from jiaoben import jball
10 class testclassone(unittest.TestCase):
11     def setUp(self):
12         print(111)
13         pass
14     def test_1(self):
15         jball()  # 執行腳本
16         pass
17     def tearDown(self):
18         print(333)
19         pass
20 
21 
22 if __name__ == '__main__':
23     unittest.main()

最後附上用例執行後的效果圖:

 

結語:

期間感謝@我去熱飯  飯哥的細心指導,給予點點莫大的幫助,謝謝!

 

爲何選擇?

有的人喜歡創造世界,他們作了程序員

有的人喜歡拯救世界,他們作了測試員

相關文章
相關標籤/搜索