【python】python_介面自動化測試框架
阿新 • • 發佈:2020-07-27
python_介面自動化測試框架
本文總結分享介紹介面測試框架開發,環境使用python3+selenium3+unittest+ddt+requests測試框架及ddt資料驅動,採用Excel管理測試用例等整合測試資料功能,以及使用HTMLTestRunner來生成測試報告,目前有開源的poman、Jmeter等介面測試工具,為什麼還要開發介面測試框架呢?因介面測試工具也有存在幾點不足。
- 測試資料不可控制。比如介面返回資料不可控,就無法自動斷言介面返回的資料,不能斷定是介面程式引起,還是測試資料變化引起的錯誤,所以需要做一些初始化測試資料。介面工具沒有具備初始化測試資料功能,無法做到真正的介面測試自動化。
- 無法測試加密介面。實際專案中,多數介面不是可以隨便呼叫,一般情況無法摸擬和生成加密演算法。如時間戳和MDB加密演算法,一般介面工具無法摸擬。
- 擴充套件能力不足。開源的介面測試工具無法實現擴充套件功能。比如,我們想生成不同格式的測試報告,想將測試報告發送到指定郵箱,又想讓介面測試整合到CI中,做持續整合定時任務。
測試框架處理流程
測試框架處理過程如下:
- 首先初始化清空資料庫表的資料,向資料庫插入測試資料;
- 呼叫被測試系統提供的介面,先資料驅動讀取excel用例一行資料;
- 傳送請求資料,根據傳引數據,向資料庫查詢得到對應的資料;
- 將查詢的結果組裝成JSON格式的資料,同時根據返回的資料值與Excel的值對比判斷,並寫入結果至指定Excel測試用例表格;
- 通過單元測試框架斷言介面返回的資料,並生成測試報告,最後把生成最新的測試報告HTML檔案傳送指定的郵箱。
測試框架結構目錄介紹
目錄結構介紹如下:
- config/: 檔案路徑配置
- database/: 測試用例模板檔案及資料庫和傳送郵箱配置檔案
- db_fixture/: 初始化介面測試資料
- lib/: 程式核心模組。包含有excel解析讀寫、傳送郵箱、傳送請求、生成最新測試報告檔案
- package/: 存放第三方庫包。如HTMLTestRunner,用於生成HTML格式測試報告
- report/: 生成介面自動化測試報告
- testcase/: 用於編寫介面自動化測試用例
- run_demo.py: 執行所有介面測試用例的主程式
- GitHub專案地址: https://github.com/yingoja/DemoAPI
資料庫封裝
1 [tester]
2 name = Jason
3
4 [mysqlconf]
5 host = 127.0.0.1
6 port = 3306
7 user = root
8 password = 123456
9 db_name = guest
10
11 [user]
12 # 傳送郵箱伺服器
13 HOST_SERVER = smtp.163.com
14 # 郵件發件人
15 FROM = 111@163.com
16 # 郵件收件人
17 TO = 222@126.com
18 # 傳送郵箱使用者名稱/密碼
19 user = aaa
20 password = aaa
21 # 郵件主題
22 SUBJECT = 釋出會系統介面自動化測試報告
1 #!/usr/bin/env python
2 # _*_ coding:utf-8 _*_
3 __author__ = 'YinJia'
4
5 import os,sys
6 sys.path.append(os.path.dirname(os.path.dirname(__file__)))
7 from config import setting
8 from pymysql import connect,cursors
9 from pymysql.err import OperationalError
10 import configparser as cparser
11
12 # --------- 讀取config.ini配置檔案 ---------------
13 cf = cparser.ConfigParser()
14 cf.read(setting.TEST_CONFIG,encoding='UTF-8')
15 host = cf.get("mysqlconf","host")
16 port = cf.get("mysqlconf","port")
17 user = cf.get("mysqlconf","user")
18 password = cf.get("mysqlconf","password")
19 db = cf.get("mysqlconf","db_name")
20
21 class DB:
22 """
23 MySQL基本操作
24 """
25 def __init__(self):
26 try:
27 # 連線資料庫
28 self.conn = connect(host = host,
29 user = user,
30 password = password,
31 db = db,
32 charset = 'utf8mb4',
33 cursorclass = cursors.DictCursor
34 )
35 except OperationalError as e:
36 print("Mysql Error %d: %s" % (e.args[0],e.args[1]))
37
38 # 清除表資料
39 def clear(self,table_name):
40 real_sql = "delete from " + table_name + ";"
41 with self.conn.cursor() as cursor:
42 # 取消表的外來鍵約束
43 cursor.execute("SET FOREIGN_KEY_CHECKS=0;")
44 cursor.execute(real_sql)
45 self.conn.commit()
46
47 # 插入表資料
48 def insert(self, table_name, table_data):
49 for key in table_data:
50 table_data[key] = "'"+str(table_data[key])+"'"
51 key = ','.join(table_data.keys())
52 value = ','.join(table_data.values())
53 real_sql = "INSERT INTO " + table_name + " (" + key + ") VALUES (" + value + ")"
54
55 with self.conn.cursor() as cursor:
56 cursor.execute(real_sql)
57 self.conn.commit()
58
59 # 關閉資料庫
60 def close(self):
61 self.conn.close()
62
63 # 初始化資料
64 def init_data(self, datas):
65 for table, data in datas.items():
66 self.clear(table)
67 for d in data:
68 self.insert(table, d)
69 self.close()
1 #!/usr/bin/env python
2 # _*_ coding:utf-8 _*_
3 __author__ = 'YinJia'
4
5 import sys, time, os
6 sys.path.append(os.path.dirname(os.path.dirname(__file__)))
7 from db_fixture.mysql_db import DB
8
9 # 定義過去時間
10 past_time = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()-100000))
11 # 定義將來時間
12 future_time = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()+10000))
13
14 # 建立測試資料
15 datas = {
16 # 釋出會表資料
17 'sign_event':[
18 {'id':1,'name':'紅米Pro釋出會','`limit`':2000,'status':1,'address':'北京會展中心','start_time':future_time},
19 {'id':2,'name':'蘋果iphon6釋出會','`limit`':1000,'status':1,'address':'寶安體育館','start_time':future_time},
20 {'id':3,'name':'華為榮耀8釋出會','`limit`':2000,'status':0,'address':'深圳福田會展中心','start_time':future_time},
21 {'id':4,'name':'蘋果iphon8釋出會','`limit`':2000,'status':1,'address':'深圳灣體育中心','start_time':past_time},
22 {'id':5,'name':'小米5釋出會','`limit`':2000,'status':1,'address':'北京國家會議中心','start_time':future_time},
23 ],
24 # 嘉賓表資料
25 'sign_guest':[
26 {'id':1,'realname':'Tom','phone':13511886601,'email':'[email protected]','sign':0,'event_id':1},
27 {'id':2,'realname':'Jason','phone':13511886602,'email':'[email protected]','sign':1,'event_id':1},
28 {