在上一篇文章內,咱們也將把表格測試數據,轉換成自己想要的內容,給做到了
已經跟著做到這一步的同學,是不是感覺略有小成呢?
數據轉換的工作咱們已經做的差不多了
接下來,咱們開始封裝requests
import requests? 引用包,沒有安裝的同學可以使用 pip install??requests 進行安裝,工具內也可以直接安裝
在control包下增加log.py和httpcaps.py文件
![python接口自動化測試 ( 第五章)](http://p2.ttnews.xyz/loading.gif)
咱們在utils.py下增加一個函數,用來創建文件工具函數
# 判斷當前目錄是否存在
def mkdir(p):
path = Path(p)
# 如果文件不存在 則創建
if not path.is_dir():
path.mkdir()
log.py代碼如下:
import logging
import datetime
from pathlib import Path
import sys
from control.utils import mkdir
# 獲得當前的時間
def today():
now = datetime.datetime.now()
return now.strftime('%Y%m%d')
# 獲取logger實例,如果參數為空則返回root logger
logger = logging.getLogger("seautotest")
# 指定logger輸出格式
formatter = logging.Formatter(
'%(asctime)s [%(levelname)s] %(filename)s line:%(lineno)d: %(message)s')
# 創建log文件夾
mkdir('log')
# 文件日誌
log_file = str(Path('log') / '{}.log'.format(today()))
file_handler=logging.FileHandler(log_file, mode='a', encoding='utf-8', delay=False)
# file_handler = logging.FileHandler(filename=log_file, encoding="utf-8")
file_handler.setFormatter(formatter) # 可以通過setFormatter指定輸出格式
# 控制檯日誌
console_handler = logging.StreamHandler(sys.stdout)
console_handler.formatter = formatter # 也可以直接給formatter賦值
# 為logger添加的日誌處理器
logger.addHandler(file_handler)
logger.addHandler(console_handler)
# 指定日誌的最低輸出級別,默認為WARN級別
# DEBUG,INFO,WARNING,ERROR,CRITICAL
logger.setLevel(logging.INFO)
開始封裝httpcaps.py
import requests
from control.log import logger
from control.utils import iscompare_json, writetoken
def htpp_requests(step, junit, sort='get'):
data = step['data'].replace("\\n", "")
http_type, parmars = datatating(data)
# 記錄為何不通過
content = ''
# 記錄是否通過
list_record = []
if http_type == 'headers':
httrequst = getattr(requests, sort)(step['element'], headers=eval(parmars))
else:
httrequst = getattr(requests, sort)(step['element'], eval(parmars))
status = httrequst.status_code
# 1.接口不等於200,不進行驗證和斷言
if status != 200:
logger.error('接口出錯了%s' % status)
return
# 獲得接口的返回值
response = httrequst.json()
expected = step['expected']
testdot = step['testdot']
# 如果是登錄的接口,將登錄的token寫入文本
if testdot in ('登錄接口驗證'):
logger.info(response['data']['token'])
writetoken(response['data']['token'])
# 2.驗證斷言內容 斷言只有在預期結果寫了#('xxx','xxx')這種才會進行
if '#' in step['expected']:
# 1預期結果 2需要斷言的內容 是元祖類型 ,返回:斷言通過 返回'' ,反之返回不通過的字段
is_as_pass = asset_content(expected, response)
# 通過
if is_as_pass == '':
content += '斷言通過'
pass
# 不通過
else:
list_record.append(1)
content += '斷言不通過%s' % is_as_pass
# 3.驗證返回值json格式
result = iscompare_json(eval(expected), response)
if result == 'Pass':
content += '對比格式通過'
else:
list_record.append(1)
content += 'json對比格式不通過'
if len(list_record) >= 1:
step['score'] = 'Fail'
junit.failure('testdot:' + step['testdot'] + '-' + 'step:' + step['no'] + '-' + 'element:' + step[
'element'] + '-' + ', %s' % content)
else:
step['score'] = 'Pass'
step['_resultinfo'] = content
step['output'] = response
logger.info(step['element'])
logger.info(response)
return step
# 處理json類型和參數
def datatating(data):
if data.strip():
http_info = data.split('=', 1)
# 獲得類型
http_type = http_info[0]
# 獲得請求的參數
parmars = http_info[1]
else:
# 獲得類型
http_type = 'parmars'
# 獲得請求的參數
parmars = "{' ': ' '}"
return http_type, parmars
# 如果有#號將進行處理,沒有不處理
def affirm(expected):
# 返回的是list
ex_list = expected.split('#')
# 0代表是預期結果,1是代表是斷言的內容
# eval處理是元祖類型
return ex_list[0], eval(ex_list[1])
def asset_content(expected, response):
# 處理預期結果的內容,切割出來斷言
# 1.是預期結果 2.是需要斷言的內容 元祖類型
expected, astent = affirm(expected)
fail_tent = ''
for t in astent:
if t not in str(response):
fail_tent += '接口沒有此值:%s,' % t
return fail_tent
封裝完成後,咱們調用試一下看看如何,因為公司的接口不方便開放,所以只能自己動手寫一個了,目錄下增加這個py文件
![python接口自動化測試 ( 第五章)](http://p2.ttnews.xyz/loading.gif)
httptunn.py代碼如下
import flask, json
server = flask.Flask(__name__) # __name__代表當前的python文件。把當前的python文件當做一個服務啟動
@server.route('/index', methods=['get', 'post']) # 第一個參數就是路徑,第二個參數支持的請求方式,不寫的話默認是get
def index():
res = {'msg': '這是我開發的第一個接口', 'msg_code': 0}
return json.dumps(res, ensure_ascii=False)
server.run(port=8888, debug=True, host='127.0.0.1')
先運行httptunn.py文件
開始調試httpcaps.py代碼增加如下
if __name__ == '__main__':
step = {'no': '1', 'testdot': '獲取驗證碼功能驗證', 'keyword': 'API', 'page': '',
'element': 'http://127.0.0.1:8888/index',
'data': "parmars={'phone': '17547817934', 'type': '1'}",
'expected': "{'msg': '這是我開發的第一個接口', 'msg_code': 0}", 'output': {'msg': '這是我開發的第一個接口', 'msg_code': 0},
'score': 'Pass', 'remark': '', '_keyword': 'API', '_element': '獲取短信驗證碼',
'_expected': "{'msg': '這是我開發的第一個接口', 'msg_code': 0}", '_output': ''}
print(htpp_requests(step, 'get'))
運行截圖如下:
小夥伴如果你運行失敗了,出現了錯誤,將下一章節進行解決你現在的問題哦
遇到報錯不要慌,總是會有解決辦法的~
原文鏈接:https://blog.csdn.net/weixin_45344334/java/article/details/94495117
閱讀更多 任性的90後boy 的文章