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方法,我们基本就达到了简单的返回验证。

当然了我们这个只是最简单的,可能还有一些更复杂的,比如对数据的格式验证,和数据的返回层级验证,与数据库中的数据进行对比等验证操作。但是我这个只是一个简单的测试框架,还没有那么重,只是提供一种思路,剩下的实现就要靠你自己了,加油。

后记

最近周末在学习驾照,而且工作也比较忙,每天都开会。所以更新比较晚一些,谢谢支持!

上一篇:7.5 实现基于探针对pod中的访问的健康状态检查


下一篇:CKS2021最新练习题解析08--优化Dockerfile 和 deployment.yaml