前言
我们已经基本完成了测试框架的前半部分工作,剩下的章节基本都是后半部分内容了。这个章节我们来说一下我们获取到请求的结果之后怎么处理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方法,我们基本就达到了简单的返回验证。
当然了我们这个只是最简单的,可能还有一些更复杂的,比如对数据的格式验证,和数据的返回层级验证,与数据库中的数据进行对比等验证操作。但是我这个只是一个简单的测试框架,还没有那么重,只是提供一种思路,剩下的实现就要靠你自己了,加油。
后记
最近周末在学习驾照,而且工作也比较忙,每天都开会。所以更新比较晚一些,谢谢支持!