测试平台系列(83) 前置条件支持Redis语句
大家好~我是
米洛
!
我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程
,希望大家多多支持。
欢迎关注我的公众号测试开发坑货
,获取最新文章教程!
回顾
上节我们打了个野,解决了一下APScheduler
的重复执行问题。在更上一节,我们编写好了Redis的在线执行功能。
那这一节我们就得把它运用到前置条件
里面来了。
成果展示
由于博主都是先编码,再写文。所以是能展示成果的,今日份变化如下:
- 支持了前置条件(REDIS类型)
思路
前置条件要想支持Redis,思路其实很简单,模式也和SQL
差不多。所以我们可以照搬SQL的代码。
之前我们的Executor都放在utils包下面,其实很不友好
。为了显示专业性,我决心把Executor从utils抽离出来,放到新目录core
下面。
这个core目录打算放一些用例执行的核心方法,咱们拭目以待。
如何修改文件而不影响其他数据
这个就需要伟大的Pycharm了,我们其实新建一个core目录以后,直接把executor.py移动到core目录即可。
通过pycharm移动文件,他不仅仅只是移动文件那么简单,它还会帮你处理这个文件引入了哪些包,如果路径发生变化了,他也会自动帮忙更新,如果有其他文件引用了executor.py,它也会顺道帮助更新。
有如此强大的ide作为支撑,所以我玩起来也是随心所欲
。
拆分Executor
随着case执行的逻辑越来越多,我们的executor.py有点hold不住,倒不是说一个py文件不能放1000行代码,只是我们没有必要让它那么臃肿
。
我们最能拆除的就是执行构造方法的函数了,首先我们的构造方法有固定的几种,先看看只支持sql和用例的时候,我们是怎么写的:
async def execute_constructor(self, env, index, path, params, req_params, constructor: Constructor):
if not constructor.enable:
self.append(f"当前路径: {path}, 构造方法: {constructor.name} 已关闭, 不继续执行")
return
if constructor.type == 0:
try:
data = json.loads(constructor.constructor_json)
case_id = data.get("case_id")
testcase, _ = await TestCaseDao.async_query_test_case(case_id)
self.append(f"当前路径: {path}, 第{index + 1}条构造方法")
# 说明是case
executor = Executor(self.logger)
new_param = data.get("params")
if new_param:
temp = json.loads(new_param)
req_params.update(temp)
result, err = await executor.run(env, case_id, params, req_params, f"{path}->{testcase.name}")
if err:
raise Exception(err)
if not result["status"]:
raise Exception(f"断言失败, 断言数据: {result.get('asserts', 'unknown')}")
params[constructor.value] = result
# await self.parse_params(testcase, params)
except Exception as e:
raise Exception(f"{path}->{constructor.name} 第{index + 1}个构造方法执行失败: {e}")
elif constructor.type == 1:
# 说明是sql语句
try:
self.append(f"当前路径: {path}, 第{index + 1}条构造方法")
data = json.loads(constructor.constructor_json)
database = data.get("database")
sql = data.get("sql")
self.append(f"当前构造方法类型为sql, 数据库名: {database}\nsql: {sql}\n")
sql_data = await DbConfigDao.execute_sql(env, database, sql)
params[constructor.value] = sql_data
self.append(f"当前构造方法返回变量: {constructor.value}\n返回值:\n {sql_data}\n")
except Exception as e:
raise Exception(f"{path}->{constructor.name} 第{index + 1}个构造方法执行失败: {e}")
可以看到,才2种方法,就已经很臃肿
了。其实更可读一点的写法,需要把几种构造方法拆开,拆开后分别有一个run方法,这样我们只需要判断类型是啥,执行对应的run方法即可。
新建abstract基类
from abc import ABC
from app.models.constructor import Constructor
class ConstructorAbstract(ABC):
@staticmethod
def run(executor, env, index, path, params, req_params, constructor: Constructor, **kwargs):
pass
基类方法类似Java的abstract类,定义一个类,不实现里面的方法则无法实例化
。
- sql实现
- testcase实现
测试用例这儿有些复杂的变动:
一般来说,我们是case调用前置条件的run方法,但由于测试用例需要再次调用executor,所以导致了什么呢?
executor引用testcase引用executor,也就是引用循环,这在python里面是禁止的,毕竟你套娃
了!
所以这里采取的土方法是把我的Executor类当参数传递进来 =。=(够土)
redis实现
其实执行redis的时候我们已经编写过类似的方法了,但因为之前是根据id执行redis,现在要改改,需要根据name执行。
根据name执行有些迫不得已,主要是因为我们case编写是适配多套环境,如果传入id的话,那么redis对应的都是固定环境的配置,无法适配多环境。
和sql一样,我们采取 env+name确定redis连接(name不变,env切换的时候,redis连接也变成动态了)
redis执行命令还需改动一下唉:
这里传入的参数不只是id了,当你传入id=xx的时候则根据id查询,传入name=xxx的时候就根据name查询,兼容了在线执行redis的接口
。
executor收尾
最终效果
看起来一目了然,其实有点像interface和impl。
今天的内容就到这里啦~下一波做啥还没想好,可能会完善后置条件或者在线执行case也或者七牛云oss吧。前路漫漫,都已经83节了。
在线体验: http://test.pity.fun
喜欢的话可以给pity点个star哦,你们的star是我的动力= =
测试平台系列(83) 前置条件支持Redis语句的更多相关文章
- 测试平台系列(95) 前置条件支持简单的python脚本
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持. 欢迎关注我的公众号米洛的测开日记,获取最新文章教程! 回顾 上一节我们构思了一下怎么去支 ...
- 测试平台系列(94) 前置条件该怎么支持Python呢
回顾 上一节我们狠狠操练了一番oss,但我们的任务还很长久,所以我们需要继续打磨我们的功能. 那今天就让我们来思考下,如何在前置条件支持python脚本,多的不说,我们也暂时不考虑其他语言,因为光考虑 ...
- 测试平台系列(82) 解决APScheduler重复执行的问题
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们编写了在线执行R ...
- 测试平台系列(85) 把redis运用到实战中
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们让支持了前置条件 ...
- 测试平台系列(80) 封装Redis客户端
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们编写了Redis ...
- 测试平台系列(79) 编写Redis配置功能(下)
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们提出了优化Dao ...
- 测试平台系列(81) 编写在线执行Redis功能
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们牛刀小试,编写了 ...
- 测试平台系列(92) 让http请求支持文件上传
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持. 欢迎关注我的公众号米洛的测开日记,获取最新文章教程! 回顾 上一节呢,我们编写了oss的 ...
- 测试平台系列(72) 了解ApScheduler基本用法
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们调研了一下市面上 ...
随机推荐
- 创建第一个Android项目
目录 创建第一个Android项目 创建HelloWorld项目 选择模板 选择模板界面的英文翻译 配置项目 配置项目界面英文翻译及解释 配置项目界面的注意事项 Name的命名规范 Package n ...
- 2021年1月-第02阶段-前端基础-HTML+CSS进阶-VS Code 软件
软件安装 VSCode软件 能够安装 VS Code 能够熟练使用 VS Code 软件 能够安装 VS Code 最常用的插件 1. VS Code简介 1.1 VS Code 简介 Visual ...
- 从C过渡到C++需要了解的“新特性”
第一个C++程序 #include <iostream> using namespace std; //编译指令 int main() { cout << "Hell ...
- __str__ __repr__区别
当print 实例化对象的时候,可以直接输出__str__ 中的 return结果 在console中 直接输实例对象c 只能输出<__main__.Cycle object at 0x0000 ...
- mybatis学习笔记(1)基本环境
1.pom引入 <dependencies> <dependency> <groupId>org.mybatis</groupId> <artif ...
- the Agiles Scrum Meeting 8
会议时间:2020.4.16 20:00 1.每个人的工作 今天已完成的工作 个人结对项目增量开发组:完成个人项目创建的部分功能 issues:增量组:准备评测机制,增加仓库自动创建和管理 团队项目增 ...
- 软件工程个人博客作业-软件案例分析:VS与VS Code
项目 内容 本作业属于北航 2020 年春软件工程 博客园班级连接 本作业是本课程个人项目作业 作业要求 我在这个课程的目标是 提高软件开发能力.团队协作能力 这个作业在哪个具体方面帮助我实现目标 提 ...
- python redis自带门神 lock 方法
redis 支持的数据结构比较丰富,自制一个锁也很方便,所以极少提到其原生锁的方法.但是在单机版redis的使用时,自带锁的使用还是非常方便的.自己有车还打啥滴滴顺风车是吧,本篇主要介绍redis-p ...
- js 原型链详解
目录 构造函数和实例 属性Prototype 属性__proto__ 访问原型上的方法 构造函数也有__proto__ 构造函数的原型也有__proto__ Object.prototype这个原型对 ...
- 算法:九宫格问题--奇数阶魔方(Magic-Square)
一.魔方介绍 魔方(这里是简称,也可以叫幻方.魔术矩阵,Magic Square)是 n×n 正方形网格(n 为每侧的单元数),里面每个单元格填充了不同的正整数 1, 2, 3, ... , n2,并 ...