pytest+yaml+allure接口自動化測試框架05.處理response


前言

我們已經基本完成了測試框架的前半部分工作,剩下的章節基本都是后半部分內容了。這個章節我們來說一下我們獲取到請求的結果之后怎么處理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方法,我們基本就達到了簡單的返回驗證。

當然了我們這個只是最簡單的,可能還有一些更復雜的,比如對數據的格式驗證,和數據的返回層級驗證,與數據庫中的數據進行對比等驗證操作。但是我這個只是一個簡單的測試框架,還沒有那么重,只是提供一種思路,剩下的實現就要靠你自己了,加油。

后記

最近周末在學習駕照,而且工作也比較忙,每天都開會。所以更新比較晚一些,謝謝支持!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM