整體框架使用的是:Python+Unittest+Requests+PyMysql+HTMLReport 多線程並發模式
- 主要依賴模塊 Unittest、Requests、PyMysql、HTMLReport
- 主要包含以下幾個模塊:
1. Business:與業務相關的公共模塊
- get_login_token:接口自動化過程中需要實時獲取token,並將實時獲取的token傳給下個接口作為請求參數
from Business.url import url_login import requests, json def login_token(username=11111, password=123456): """獲取登錄后的token""" headers = {'Content-Type': 'application/json;charset=UTF-8'} request_param = { "username": username, "password": password } response = requests.post(url_login, data=json.dumps(request_param), headers=headers) # 返回JSON中data數據的token print(response.json()['data']['token']) return response.json()['data']['token'] if __name__ == '__main__': login_token()
- headers:頭部信息
headers = { 'Content-Type': "application/x-www-form-urlencoded", 'X-Requested-With': "XMLHttpRequest", 'Content-Length': "124", 'Connection': "keep-alive" }
- url:對應的URL地址
erp_url = 'https://www.baidu.com'
2. Common:與業務無關公共模塊
- connect_db:連接數據庫,並操作數據庫
import pymysql # python3用的是pymysql,python2用的是MySQLdb class OperationMysql: """ 數據庫SQL相關操作 """ def __init__(self): self.conn = pymysql.connect( host='127.0.0.1', port=3306, user='test', passwd='111111', db='test', charset='utf8', cursorclass=pymysql.cursors.DictCursor ) self.cur = self.conn.cursor() # 查詢一條數據 def search_one(self, sql): self.cur.execute(sql) result = self.cur.fetchone() # 只顯示一行結果 # result = self.cur.fetchall() # 顯示所有結果 return result # 更新SQL def updata_one(self, sql): self.cur.execute(sql) self.conn.commit() self.conn.close() if __name__ == '__main__': op_mysql = OperationMysql() res = op_mysql.search_one("SELECT * from odi_order WHERE order_no='12222'") print(res)
3.TestCase:測試用例層
- test_case:用例數據
import unittest from HTMLReport import logger import requests from Business.url import erp_url class Category(unittest.TestCase): """ERP屬性接口""" def setUp(self): self.session = requests.Session() logger().info("獲取會話") def tearDown(self): self.session.close() logger().info("關閉會話") def test_type_list(self): """get請求方式""" s = self.session querystry = {} r = s.get(erp_url + '/xxx.list', params=querystry) logger().info(f"返回數據{r.json()}") self.assertEqual("success", r.json().get("msg")) def test_pay_success_recommend(self): """Post請求方式""" s = self.session payload = { "token": login_token, "p": "ios", "v": "5.6.0", "order_no": "111111" } r = s.post(erp_url + '/xxxxx/aaa', data=payload) logger().info(f"返回數據:{r.json()}") self.assertEqual('success', r.json().get('msg'))
4.TestSuite:測試套件封裝
- suite_api:測試套件
import unittest from Test_Case.refactor import test_order def get_suite(): suite = unittest.TestSuite() loader = unittest.TestLoader() suite.addTests(loader.loadTestsFromTestCase(test_order.Apitests)) return suite
5.Run:主運行文件
import unittest from Test_Suite import suite_api import HTMLReport import time suite = unittest.TestSuite() suite.addTests(suite_api.get_suite()) HTMLReport.TestRunner( title="XXX項目測試報告", description="測試人員:CesareCheung", report_file_name=f"testreport", thread_count=50 ).run(suite)
6.框架整體結構圖: