python接口自動化基礎框架結構 ——分層
--bin 用於存放啟動文件,如run.py
--cases cases目錄,存放測試腳本
--data YAML文件
--lib 存放各種附加的代碼文件,如加密、鏈接數據庫、生成測試腳本等
--report 存放報告
--setting.py 存放各種路徑配置、服務器接口配置等等
--case_template.txt 模板文件,生成測試腳本的模板
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
--setting.py 存放各種路徑配置、服務器接口配置等等
import os
#設置目錄的絕對路徑
BASE_PATH = os.path.dirname(os.path.abspath(__file__))
DATA_PATH = os.path.join(BASE_PATH, 'data') #yaml測試用例存放位置
CASE_PATH = os.path.join(BASE_PATH, "testcase") #測試用例存放位置
REPORT_PATH = os.path.join(BASE_PATH, 'report') #測試報告存放位置
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
--case_template.txt 模板文件,生成測試腳本的模板
#接口自動化模板
import os
import unittest
import requests
from lib.md5_passwd import hash_code
from ddt import ddt,file_data
from lib.set_case_file import set_res_data
from setting import DATA_PATH
@ddt
class %(class_name)s(unittest.TestCase):
@file_data(os.path.join(DATA_PATH, '%(data_file)s.yaml'))
def test_%(method_name)s(self, **casedata):
url = casedata.get('url')
data = casedata.get('data')
method = casedata.get("method")
if "password" in data: #判斷是否存在密碼
data["password"] = hash_code(data["password"]) # 密碼取出后加密傳給自身
if method == "post":
result = requests.post(url=url, data=data) #post請求
else:
result = requests.get(url=url, params=data) #get請求
try:
if method.lower()=='post':
res = requests.post(url,data=data)
resp = res.text
else:
res = requests.get(url,params = data)
resp =res.text
except Exception as e:
print("接口請求出錯!")
resp = e
asserlist = casedata.get("asserlist")
check = set_res_data(result.text)
for asser in asserlist:
self.assertIn(asser, check)
if __name__ == '__main__':
unittest.main()
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
--bin 用於存放啟動文件,如run.py
run.py文件代碼
import os
import sys
import unittest
from setting import *
from lib.set_case_file import create_case_file
import time
from BeautifulReport import BeautifulReport as BetRep
#將當前項目的目錄加入零時環境變量,避免在其他地方運行時會出現引入錯誤
base_path = os.path.dirname(
os.path.dirname(os.path.abspath(__file__))
)
sys.path.append(base_path)
#首先調用生成用例函數
create_case_file()
#查找用例
discover = unittest.defaultTestLoader.discover(
start_dir=CASE_PATH,
pattern='*.py'
)
#執行生成測試報告
tittle = '接口測試'
time_now = time.strftime('%Y-%m-%d-%H_%M_S')
runner = BetRep(discover)
runner.report(tittle,
filename='{}_接口測試'.format(time_now),
report_dir=REPORT_PATH
)
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
lib 存放各種附加的代碼文件,如加密、鏈接數據庫、生成測試腳本等
MD5加密
import hashlib
def hash_code(pwd):
md5 = hashlib.md5() #獲取md5對象
md5.update(pwd.encode('utf-8')) #將傳入的pwd編碼后,更新MD5的狀態
return md5.hexdigest() #返回十六進制的MD5碼
if __name__ == '__main__':
print(hash_code('12345'))
set_case_file.py 生成測試腳本
from setting import *
def set_res_data(res):
if res:
return res.lower().replace('":"', "=").replace('":', "=")
def create_case_file():
file_lists = os.listdir(DATA_PATH) #取出data目錄下的所有文件
template_file = os.path.join(BASE_PATH,'case_template.txt')
for fList in file_lists:
if fList.endswith('.yaml') or fList.endswith('.yml'):
#測試用例文件名和yaml文件名
data_file = fList.replace('.yaml','').replace('.yml','')
#測試用例方法名
test_method_name = data_file.lower() #方法名全小寫
#測試用例類名
test_class_name = test_method_name.capitalize() #首字母大寫
with open(template_file,'r',encoding='utf-8') as temp:
content = temp.read()%{
'class_name' :test_class_name,
'method_name' : test_method_name,
'data_file' : data_file
}
test_case_file = 'test_{}.py'.format(data_file)
#根據模板生成測試用例文件
with open(os.path.join(CASE_PATH,test_case_file),'w',encoding='utf-8') as f:
f.write(content)
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
YAML文件
以小白接口為例,數據需替換
- #用戶注冊
method: post
url: http://hd215.api.okayapi.com/?s=App.User.Register
data:
app_key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
username: xxx
password: xxx
asserlist:
- ret=200
- err_code=0
- err_msg=
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————