前言
我們已經基本完成了測試框架的前半部分工作,剩下的章節基本都是后半部分內容了。這個章節我們來說一下我們獲取到請求的結果之后怎么處理response(響應)。本來計划序列化和反序列化放一個章節的,但是鑒於內容有點少,所以我把4 5章節合並了。
序列化和反序列化
我們打開common/json.py
文件。
# -*- coding: utf-8 -*-
__author__ = 'wxhou'
__email__ = '1084502012@qq.com'
"""
序列化和反序列化類
"""
import json
def loads(content):
"""
反序列化
json對象 -> python數據類型
"""
return json.loads(content)
def dumps(content, ensure_ascii=True):
"""
序列化
python數據類型 -> json對象
"""
return json.dumps(content, ensure_ascii=ensure_ascii)
def is_json_str(string):
"""驗證是否為json字符串"""
try:
json.loads(string)
return True
except:
return False
我們通過自帶的json模塊,封裝兩個方法
- loads,這個主要用來把json字符串轉換為python對象。
- dumps,主要用來把python對象轉換成json格式。
- is_json_str我們可能需要對一個字符串是不是json格式需要做驗證,所以我們寫一個這樣的方法。
正則處理
在開始對response進行處理之前,我們需要封裝一下正則方法。
打開common/regular
文件,輸入以下內容。
# -*- coding: utf-8 -*-
__author__ = 'wxhou'
__email__ = '1084502012@qq.com'
"""
正則相關操作類
"""
import re
from common.json import is_json_str
from utils.logger import logger
def get_var(key, raw_str):
"""獲取變量"""
if is_json_str(raw_str):
return re.compile(r'\"%s":"(.*?)"' % key).findall(raw_str)[0]
return re.compile(r'%s' % key).findall(raw_str)[0]
這個的目的就是為了我們能在json數據中,通過名稱能夠獲取到名稱所對應的值。例如有以下字符串A
{"username":"admin"}
我們能夠通過get_var(username, A)
,獲取到admin的信息。
處理result
當我們把准備工作做好之后我們就可以在result.py。文件中對我們的內容進行處理了。
我們打開common/result.py
,輸入以下內容:
# -*- coding: utf-8 -*-
__author__ = 'wxhou'
__email__ = '1084502012@qq.com'
"""
response響應處理
"""
import re
import pytest
from common.cache import cache
from common.regular import re, get_var
from utils.logger import logger
def check_results(r, validate):
"""檢查運行結果"""
expectcode = validate.get('expectcode')
resultcheck = validate.get('resultcheck')
regularcheck = validate.get('regularcheck')
if expectcode:
pytest.assume(expectcode == r.status_code)
if resultcheck:
pytest.assume(resultcheck in r.text)
if regularcheck:
pytest.assume(re.findall(regularcheck, r.text))
可以看到我封裝了檢查運行結果的函數,這個里里面我用了一個類庫。pytest-assume用過的朋友應該知道這個有什么作用。
官方地址:https://github.com/astraw38/pytest-assume
該插件的主要作用是,在斷言失敗后繼續運行,並且會統計斷言的報錯情況。能夠保證完整的運行,不會因為一個錯誤而發生整個測試停止的問題。
這個添加好之后我們,接着打開conftest.py
文件,在YamlTest
類中把我們這個方法集成進去。
from common.result import check_results
+++
def runtest(self):
"""Some custom test execution (dumb example follows)."""
r = self.request.send_request(**self.spec)
self.response_handle(r, self.spec.get('Validate'))
def response_handle(self, r, validate):
"""Handling of responses"""
if validate:
check_results(r, validate)
+++
我們在文件中添加以上內容。我們先創建一個response_handle處理方法。然后在runtest執行的時候導入這個方法,通過傳入,請求的返回和需要驗證的結果,通過check_result方法,我們基本就達到了簡單的返回驗證。
當然了我們這個只是最簡單的,可能還有一些更復雜的,比如對數據的格式驗證,和數據的返回層級驗證,與數據庫中的數據進行對比等驗證操作。但是我這個只是一個簡單的測試框架,還沒有那么重,只是提供一種思路,剩下的實現就要靠你自己了,加油。
后記
最近周末在學習駕照,而且工作也比較忙,每天都開會。所以更新比較晚一些,謝謝支持!