一庆寺、接口自動(dòng)化的意義
新版本上線時(shí)之前版本的功能需要進(jìn)行回歸測(cè)試,導(dǎo)致大量的重復(fù)性手工測(cè)試诉字。引入自動(dòng)化測(cè)試可以使用自動(dòng)化技術(shù)代替部分手工的回歸性測(cè)試懦尝,解放更多人力做其它更有必要的事情。但目前項(xiàng)目UI變動(dòng)頻繁壤圃,而接口一般不會(huì)做大變動(dòng)所以先暫時(shí)做接口自動(dòng)化陵霉。使用接口自動(dòng)化可以做上線前接口功能的回歸性測(cè)試,也可以定時(shí)巡檢線上環(huán)境接口的運(yùn)行情況伍绳,能及時(shí)發(fā)現(xiàn)線上環(huán)境接口問題并解決踊挠。同時(shí)此框架可以幫助不會(huì)寫代碼的測(cè)試同事進(jìn)行接口自動(dòng)化的相關(guān)工作。
二冲杀、準(zhǔn)備工作
? ? 開發(fā)語言:Python3
需要安裝的模塊:
Requests: python的一個(gè)HTTP客戶端庫效床,和urllib、urllib2類似权谁。
1剩檀、安裝方法:
使用pip安裝
pip?install?Requests
或?
python3?-m?pip?install?Requests? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
下載源碼后安裝
git clone git://github.com/kennethreitz/requests.git
cd requests
python setup.py install
xlsxwriter:是python用來構(gòu)造xlsx文件的模塊,可以完成xlsx文件的自動(dòng)化構(gòu)造闯传,包括:合并單元格谨朝,制作excel圖表等功能卤妒。
1甥绿、安裝方法:
使用pip安裝
pip?install?Requests
或?
python3?-m?pip?install?Requests
三、框架流程及邏輯
框架理念:使用json文件編寫測(cè)試用例则披,建一個(gè)腳本循環(huán)讀取測(cè)試用例并執(zhí)行共缕,然后對(duì)比返回的接口和用例中的期望結(jié)果。將測(cè)試結(jié)果寫入到一個(gè)excel表格中生成測(cè)試報(bào)告士复,最后使用發(fā)送郵件功能將測(cè)試報(bào)告發(fā)送到指定郵箱图谷。其中對(duì)所有公共方法進(jìn)行封裝并放在common公共文件目錄下翩活。
四、各模塊介紹
----interface_test ? ? ? ? ? ? ? ? ? ? ? ? ? ? 項(xiàng)目文件夾目錄
? ? ----common ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?存放公共方法目錄
? ? ? ? ? ? ----__init__.py ? ? ? ? ? ? ? ? ? ?初始化文件
? ? ? ? ? ? ----conf.py ? ? ? ? ? ? ? ? ? ? ? ? ?操作配置文件相關(guān)方法
? ? ? ? ? ? ----excelaction.py ? ? ? ? ? ? ? ?Excel文件相關(guān)操作方法
? ? ? ? ? ? ----jsonaction.py ? ? ? ? ? ? ? ? Json文件相關(guān)操作方法
? ? ? ? ? ? ----logger.py ? ? ? ? ? ? ? ? ? ? ? 記錄日志的相關(guān)方法
? ? ? ? ? ? ----newfile.py ? ? ? ? ? ? ? ? ? ? ?獲取最新文件的相關(guān)方法
? ? ? ? ? ? ----sendmail.py ? ? ? ? ? ? ? ? ? 發(fā)送報(bào)告到指定郵箱的相關(guān)方法
? ? ? ? ? ? ----signture.py ? ? ? ? ? ? ? ? ? ?對(duì)數(shù)據(jù)進(jìn)行簽名的相關(guān)方法
? ? ? ? ? ? ----userinfo.py ? ? ? ? ? ? ? ? ? ?獲取用戶信息的相關(guān)方法
? ? ? ? ? ? ----config_test.conf ? ? ? ? ? ? 基本配置文件
? ? ----logs ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 存放日志的目錄
? ? ----report ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?存放測(cè)試報(bào)告的目錄
? ? ----test_data ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?存放測(cè)試用例數(shù)據(jù)的目錄
? ? ? ? ? ? ----login-1.json ? ? ? ? ? ? ? ? ? ?登錄接口的測(cè)試用例數(shù)據(jù)
? ? ? ? ? ? ----logout-2.json ? ? ? ? ? ? ? ? ?退出登錄接口的測(cè)試用例數(shù)據(jù)
? ? ----execute_test.py ? ? ? ? ? ? ? ? ? ? ? 讀取測(cè)試用例并執(zhí)行測(cè)試用例
----test.bat ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?運(yùn)行測(cè)試項(xiàng)目的批處理文件
execute_test.py 主要程序
1 # -*- coding: utf-8 -*-
? 2 #!/usr/bin/env python? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? 3 import os? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? 4 import json? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? 5 import requests? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? 6 import common.conf as conf? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? 7 import common.excelaction as excelaction? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? 8 from common.sendemail import sendreport? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? 9 from common.signture import sign? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
10 import common.userinfo as userinfo? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
11 import common.logger as logger? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
12 import sys? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
13 import time? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
14? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
15 #data_path = os.path.dirname(__file__) + '\\test_data\\' # 測(cè)試用例數(shù)據(jù)文件所在目錄? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
16 data_path = conf.testdata_path? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
17? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
18 test_reports = [] # 添加一個(gè)數(shù)組用來存儲(chǔ)測(cè)試結(jié)果? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
19 for file in os.listdir(data_path): # 循環(huán)讀取目錄下的文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
20? ? child = os.path.join('%s%s'%(data_path,file)) # 將文件名和路徑拼接好? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
21? ? logger.info("當(dāng)前打開的文件:"+child)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
22? ? fl = open(child) # 打開文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
23? ? try:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
24? ? ? ? cases = json.load(fl)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
25? ? ? ? for key in cases: # 循環(huán)讀取文件中的測(cè)試用例(case)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
26? ? ? ? ? ? start_time = time.clock()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
27? ? ? ? ? ? case = cases[key]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
28? ? ? ? ? ? url = conf.get_conf('module',case['module']) + case['url']? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
29? ? ? ? ? ? data = case['data']? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
30? ? ? ? ? ? data['Platform'] = conf.get_conf('params','Platform')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
31? ? ? ? ? ? data['Terminal'] = conf.get_conf('params','Terminal')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
32? ? ? ? ? ? data['UserIP'] = conf.get_conf('params','UserIP')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
33? ? ? ? ? ? data['Version'] = conf.get_conf('params','Version')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
34? ? ? ? ? ? if "UserToken" in data and data['UserToken'] == '':? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
35? ? ? ? ? ? ? ? data['UserToken'] = userinfo.get_token()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
36? ? ? ? ? ? hope_result = case['assert']? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
37? ? ? ? ? ? method = case['method']? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
38? ? ? ? ? ? test_report = {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
39? ? ? ? ? ? ? ? "case_id":case['id'],? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
40? ? ? ? ? ? ? ? "t_name":case['name'],? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
41? ? ? ? ? ? ? ? "method":method,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
42? ? ? ? ? ? ? ? "url":url,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
43? ? ? ? ? ? ? ? "params":data,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
44? ? ? ? ? ? ? ? "hope_result":hope_result,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
45? ? ? ? ? ? ? ? "actual_result":[],? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
46? ? ? ? ? ? ? ? "test_result":""? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
47? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
48? ? ? ? ? ? try:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
49? ? ? ? ? ? ? ? if method == 'post':? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
50? ? ? ? ? ? ? ? ? ? addsign_data = sign(data,conf.get_conf('sign','api_key'))? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
51? ? ? ? ? ? ? ? ? ? r = requests.post(url,data=json.dumps(addsign_data),headers=conf.header)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
52? ? ? ? ? ? ? ? ? ? response = r.json()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
53? ? ? ? ? ? ? ? ? ? s = True? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
54? ? ? ? ? ? ? ? ? ? for k in hope_result:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
55? ? ? ? ? ? ? ? ? ? ? ? ar = str(k) + ":" + str(response[k])? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
56? ? ? ? ? ? ? ? ? ? ? ? test_report["actual_result"].append(ar)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
57? ? ? ? ? ? ? ? ? ? ? ? if type(hope_result[k]) == type(''):? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
58? ? ? ? ? ? ? ? ? ? ? ? ? ? if hope_result[k] in response[k]:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
59? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s = s&True? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
60? ? ? ? ? ? ? ? ? ? ? ? ? ? else:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
61? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s = s&False? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
62? ? ? ? ? ? ? ? ? ? ? ? else:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
63? ? ? ? ? ? ? ? ? ? ? ? ? ? if hope_result[k] == response[k]:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
64? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s = s&True? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
65? ? ? ? ? ? ? ? ? ? ? ? ? ? else:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
66? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s = s&False? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
67? ? ? ? ? ? ? ? ? ? if s:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
68? ? ? ? ? ? ? ? ? ? ? ? test_report["test_result"] = "PASS"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
69? ? ? ? ? ? ? ? ? ? else:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
70? ? ? ? ? ? ? ? ? ? ? ? test_report["test_result"] = "Fail"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
71? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
72? ? ? ? ? ? ? ? elif method == 'get':? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
73? ? ? ? ? ? ? ? ? ? addsign_data = sign(data,conf.get_conf('sign','api_key'))? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
74? ? ? ? ? ? ? ? ? ? r = requests.get(url,params=addsign_data,headers=conf.header)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
75? ? ? ? ? ? ? ? ? ? response = r.json()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
76? ? ? ? ? ? ? ? ? ? s = True? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
77? ? ? ? ? ? ? ? ? ? for k in hope_result:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
78? ? ? ? ? ? ? ? ? ? ? ? ar = str(k) + ":" + str(response[k])? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
79? ? ? ? ? ? ? ? ? ? ? ? test_report["actual_result"].append(ar)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
80? ? ? ? ? ? ? ? ? ? ? ? if type(hope_result[k]) == type(''):? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
81? ? ? ? ? ? ? ? ? ? ? ? ? ? if hope_result[k] in response[k]:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
82? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s = s&True? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
83? ? ? ? ? ? ? ? ? ? ? ? ? ? else:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
84? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s = s&False? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
85? ? ? ? ? ? ? ? ? ? ? ? else:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
86? ? ? ? ? ? ? ? ? ? ? ? ? ? if hope_result[k] == response[k]:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
87? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s = s&True? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
88? ? ? ? ? ? ? ? ? ? ? ? ? ? else:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
89? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? s = s&False? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
90? ? ? ? ? ? ? ? ? ? if s:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
91? ? ? ? ? ? ? ? ? ? ? ? test_report["test_result"] = "PASS"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
92? ? ? ? ? ? ? ? ? ? else:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
93? ? ? ? ? ? ? ? ? ? ? ? test_report["test_result"] = "Fail"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
94? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
95? ? ? ? ? ? ? ? else:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
96? ? ? ? ? ? ? ? ? ? print(u'暫不支持該請(qǐng)求方式')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
97? ? ? ? ? ? ? ? test_reports.append(test_report)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
98? ? ? ? ? ? ? ? end_time = time.clock()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
99? ? ? ? ? ? ? ? str_time = '當(dāng)前執(zhí)行的用例:' + key + '_'*4 + '用例執(zhí)行所用時(shí)間:' + str(end_time-? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? start_time) + 's'? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
100? ? ? ? ? ? ? ? logger.info(str_time)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
101? ? ? ? ? ? except:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
102? ? ? ? ? ? ? ? error_msg = sys.exc_info()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
103? ? ? ? ? ? ? ? logger.error(error_msg)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
104? ? ? ? ? ? ? ? continue? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
105? ? except:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
106? ? ? ? error_msg = sys.exc_info()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
107? ? ? ? logger.error(error_msg)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
108? ? ? ? continue? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
109? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
110 excelaction.creat_report(test_reports) #生成測(cè)試報(bào)告? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
111 sendreport() #發(fā)送測(cè)試報(bào)告? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
五便贵、具體使用
1菠镇、在配置文件做對(duì)應(yīng)項(xiàng)目的基礎(chǔ)配置
[email] -- 郵箱相關(guān)配置
sender = ***@163.com -- 發(fā)件郵箱
receiver = ***@163.com -- 收件郵箱
smtpserver = smtp.163.com -- 發(fā)件郵箱服務(wù)器
username = ***@163.com -- 發(fā)件郵箱賬戶名
password = **** -- 發(fā)件郵箱密碼(用于第三方登錄的秘密)
[module] -- 模塊相關(guān)接口域名配置
passport = http://passport.XXX.com/ -- 對(duì)應(yīng)模塊接口域名
[sign] -- 簽名相關(guān)的配置
api_key = XXX-XXX -- 生成簽名的key(填寫項(xiàng)目對(duì)應(yīng)的key)
[params] -- 接口參數(shù)配置(配置公共參數(shù))
Platform = 1 -- 根據(jù)對(duì)應(yīng)項(xiàng)目配置對(duì)應(yīng)的公共參數(shù)和對(duì)應(yīng)值
2、在test_data文件夾內(nèi)用json文件寫測(cè)試用例和對(duì)應(yīng)參數(shù)?
"case1":{
? ? "name":"登錄接口_測(cè)試正常登錄",? ? ? ? -- 接口名稱(或者接口簡(jiǎn)介)
? ? "module":"passport",? ? ? ? ? ? ? ? -- 接口所屬模塊
? ? "url":"/api/Passport/Login",? ? ? ? ? ? -- 接口地址(完整地址由模塊對(duì)應(yīng)域名+該地址拼接)
? ? ? "method":"post",? ? ? ? ? ? ? ? ? ? -- 接口請(qǐng)求方式
? ? ? "id":"1-001",? ? ? ? ? ? ? ? ? ? ? ? -- 用例ID
? ? "data":{? ? ? ? ? ? ? ? ? ? ? ? ? ? -- 接口請(qǐng)求參數(shù)(請(qǐng)求時(shí)由該參數(shù)加公共參數(shù))
? ? ? ? "UserName":"XXX",? ? ? ? ? ? ? ? -- 接口請(qǐng)求參數(shù)(根據(jù)具體接口補(bǔ)充承璃,如果接口需要token則需要加token關(guān)鍵字(值為空就行)利耍,接口請(qǐng)求時(shí)會(huì)自動(dòng)根據(jù)參數(shù)生成Sign,如果想自己定義則需要加Sign關(guān)鍵字(值填寫自己定義的))
? ? ? ? },
? ? "assert":{? ? ? ? ? ? ? ? ? ? ? ? ? ? -- 該條測(cè)試用例的斷言條件
? ? ? ? "Status":200,? ? ? ? ? ? ? ? ? ? -- 具體的斷言條件盔粹,需要返回狀態(tài)為200
? ? ? ? "Message":"登錄成功"? ? ? ? ? ? -- 具體的斷言條件
? ? ? ? }
? ? }
3隘梨、配置好基礎(chǔ)配置和編寫完測(cè)試用例后,運(yùn)行項(xiàng)目中的test.bat文件舷嗡。運(yùn)行完成后會(huì)在report文件夾內(nèi)生成測(cè)試報(bào)告文件轴猎,在logs文件夾內(nèi)會(huì)生成測(cè)試運(yùn)行過程中的記錄日志和報(bào)錯(cuò)日志
創(chuàng)建了一個(gè)測(cè)試交流群,如果對(duì)軟件測(cè)試进萄、接口測(cè)試捻脖、自動(dòng)化測(cè)試、面試經(jīng)驗(yàn)交流感興趣可以加測(cè)試交流群:829792258中鼠,還會(huì)有同行一起技術(shù)交流