2021-12-09: 渐渐放弃有码模式,本文最后部分可忽略。
记得上次说到,我们制作了一个简易的支持HTTP请求的页面,实际上我们却没有把它用到用例之中
。
我这个人有个很大的缺点,想到啥就做啥,经常是事先设计一个简版,然后后续进行打磨,其实这样对一个成熟的系统来说太不友好了,很多东西可能在设计的时候就太过于局限了。这里不扯废话了,直接进入主题吧。
思考过很多次,目前在公司制作的测试平台有个特点,就是不需要写代码就可以完成接口测试用例的编写,只不过碍于对大家的成长没有太大的提升
,所以我这次打算做到兼容,如果你愿意写代码,那么你可以导入代码或者在线编写代码,如果不想看到代码,也可以采用无码模式,并且还要做到随时转换。
从设计上来说,用例以链路的形式执行,一个用例会有很多个临时变量,通过它们,我们可以解决数据依赖,完成对整个流程的测试。由于笔者画图能力有限,所以这里就不上图了。一个用例分为几个部分:
前置 setUp 操作
用例执行
后置 tearDown 操作
其中每个操作里面都拥有很多个步骤 (step),每个 step 产生的数据都会在主用例的生命周期中保存,达到数据互通的效果。
这里的步骤可以是http请求
,redis操作
,sql语句
,python代码片段
等等,每个步骤都可以拥有一个返回值,通过返回值解决数据依赖问题。
如果我们需要获取用户的余额,那么我们的用例将这样去编写:
用例名称: 用户登录
前置条件: 无
用例执行: 发送 http 请求,获取 token
后置条件: 无
断言语句: 校验 http 状态码等
用例名称: 获取用户余额
前置条件:
step1: 用户登录
记录返回值为 step1,通过 step1.token 获取到登录接口中的 token 数据
用例执行:
把 body 中的 ${step1.token}替换为真实的 token,发送 http 请求。
后置条件:无
断言语句: 校验 code 和 msg 以及 data 字段中的信息
初期看不懂不要紧,大概方向是这个样子。主要也没有图片,这是一个流程化的东西。
主要内容有:
上述的代码相关的操作都是为了能将数据和代码进行互相转换,具体的构思还没有完全想好。我喜欢边写边想,不然我想得肯定不全,只有写的时候遇到问题了才能想好要怎么做下一步。
给我思考的时间有限,我只能走一步算一步了!
其实这里我也觉得自己说的云里雾里,还是等后续成品出来了,回过头来看或者修改这篇文章吧!
这边我们自己内定一套规则,凡是${变量}
这种数据,都是需要替换的变量,可能由其他前置或常量产生,需要随时替换。这个规则要求变量尽量简单,不要搞特殊符号。
import re
el_exp = r"\$\{(.+)\}"
pattern = re.compile(el_exp)
def get_el_expression(string: str):
"""
获取el表达式
:param string:
:return:
"""
return re.findall(pattern, string)
if __name__ == "__main__":
s = "select * from xxx where name = '${mygod}'"
print(get_el_expression(s))
我们用正则提取变量,这样如果我们的 sql 语句里面有变量的情况下,可以做到动态 sql 语句,如上图。不过基于这,我们还需要提供一个变量池,用来存放这个用例的所有临时变量
。
"""
pity变量池
变量池的生命周期与用例保持一致
"""
__author__ = "xiaoke"
class VarPool(object):
def __init__(self, case_id):
"""
:param case_id: 用来标识变量所处的主生命周期case
"""
self.cache = dict()
self.case_id = case_id
def set(self, key, value):
self.cache[key] = value
def get(self, key):
return self.cache.get(key)
def get_default(self, key, default_value):
return self.cache.get(key, default_value)
这里创建了一个变量池类,实际上维护了一个 map,当然由于复杂场景下,可能会有变量冲突的情况,所以我们会在 web 页面层去控制,去保证用户不使用重复的变量。
今天的内容就先到这里了,主要还是一个构思的问题。后面慢慢补全这些概念,使它越来越明朗。因为我现在也很懵逼,如果疑惑的话,可以等整个用例流程打通了再来回顾一下。
后续的话 pity_basic 会作为一个tar 包,可在 pypi 下载,单独抽出这个包的主要原因还是为了支持代码和无码模式的切换。