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

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

    后记

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

    随风挥手 ——土木狗的IT生涯 群: 299524235
  • 相关阅读:
    Pro ASP.NET MVC 3 Framework 译文(一)
    Pro ASP.NET MVC 3 Framework译文(二)第二章:准备工作
    新写的JS无限树状列表
    Windows phone中如何使用丰富的弹出框提示
    Windows phone中用RichTextBox实现文字、图片混合排版
    Windows phone中如何添加页面跳转动画
    java虚拟机JVM内存不够,OutOfMemorry Error
    Oracle常用的导入导出命令
    Oracle经常断开连接
    安装oracle后,很卡
  • 原文地址:https://www.cnblogs.com/wxhou/p/InterfaceYamlFramework05.html
Copyright © 2020-2023  润新知