测试平台系列(94) 前置条件该怎么支持Python呢
回顾
上一节我们狠狠操练
了一番oss,但我们的任务还很长久,所以我们需要继续打磨我们的功能。
那今天就让我们来思考下,如何在前置条件
支持python脚本,多的不说,我们也暂时不考虑其他语言,因为光考虑支持python,已经够呛啦。
本文旨在探讨一些思路的可行性,不会实际着手编写。
究竟缺什么
因为我们只考虑Python脚本,所以我们必须认真考虑
我们的需求。
能够通过python脚本构建数据
我举个例子,我可以用python脚本实现一些很复杂的功能,而这些功能在当前条件下都不大可能支持。比方说,我想获取当前月的第一天的日期,又或者我想做一些加解密/base64的运算,尽管
pity
可以默认帮助实现这些功能,但总会有意想不到的场景出现。为了解决这些困难,我们可以适当编写脚本完成这些工作。能够支持参数
这里的参数指的是
pity
内置的参数${参数}能够获取到
返回值
这个需求大家都能理解,有时候我是想触发一个功能,比如给某些人发邮件,我不需要知道过程,我只要完成这个功能即可。而有时候呢,我需要的是执行过程,并得到
确切的结果
。所以这个功能是必不可少的。
思索方案
要想在python web中执行动态的python脚本,我们可以怎么做呢?
exec
exec是一个能够执行给定python代码
的系统方法,可能也不是很被推荐。它接受的参数是python代码
,举个例子:
# 执行原生python脚本print了一条语句
exec(print("你在肝什么"))
接着我们试试在exec中定义一个方法main,并试试能不能调用。
可以看到是能的,这个我只能说肥肠牛批
!因为我也基本是没用过,只是知道,今天也是和大家一起尝试下。
至于为什么不被推荐,可能是因为危险性过高,毕竟你传入的啥人家都能给你执行掉。
不过好在exec的数据可以拿到方法执行的返回值,也可以通过字符串替换
的方式获得对应的返回值。
自建python项目
由于代码都是python,我们完全可以用git维护一套python工具库。接着通过动态导入
来执行对应的方法,这样做的好处是更灵活,但也伴随着更高的成本。
我们得去更新代码(包括监听git push钩子,或者定时拉取以及手动更新),还得提供一个编辑页面,可以让用户更改对应的代码。
但最烦人的还是有扩展包的时候,我们的web项目甚至都需要去安装扩展包
。
说起原理倒不难,简单的说就是内嵌了一个python文件目录,通过import导入对应的方法并执行。
http的方式(不推荐)
新启动一个服务,里面提供了一个api,通过传入method,param等信息,实现调用方法并拿到返回值
的效果。
缺点就是代价比较大,起了新服务,如果服务挂掉影响较大。优点是能够跨语言,但是还是偏重
了。
mq
有http就可以有mq的方式,通过生产者和消费者去解耦A系统依赖B系统的逻辑,用消息队列来处理相关逻辑,可以用rabbitmq完成这样的工作。
grpc
虽然grpc很强大,但是不推荐,虽然跨语言是个非常诱人的特性
,但是对于新人不太友好,有一定的学习成本,底层虽然改用rpc调用,序列化升级为protobuf会更高效,但学习成本高,官方也没有好的负载均衡/服务注册发现方案,对于不同语言甚至要实现不同的一套逻辑,开发成本也不低。
总结
上面大概列举了5种方式,我个人比较相对推荐的还是exec,内置python包和mq的形式。
方案 | 多语言 | 成本 | 稳定性 | 额外组件 |
---|---|---|---|---|
exec | 否 | 低 | 高 | 否 |
import | 否 | 中 | 高 | 否 |
http | 是 | 高 | 低 | 否 |
mq | 是 | 高 | 中 | 是 |
grpc | 是 | 非常高 | 中 | 是 |
mq的缺点就是需要实现不同语言的消费者以及需要引入额外的组件。由于我们暂时只支持python,所以我们优先选择第一种exec的方式,至于第二种,我是有计划也一并加入的。
本节内容就介绍到这里,欢迎大家给出其他想法或者建议,也可以一起讨论。
后端代码仓库: http://github.com/wuranxu/pity
前端代码仓库: http://github.com/wuranxu/pityWeb
测试平台系列(94) 前置条件该怎么支持Python呢的更多相关文章
- 测试平台系列(83) 前置条件支持Redis语句
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上节我们打了个野,解决了一 ...
- 测试平台系列(95) 前置条件支持简单的python脚本
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持. 欢迎关注我的公众号米洛的测开日记,获取最新文章教程! 回顾 上一节我们构思了一下怎么去支 ...
- 测试平台系列(92) 让http请求支持文件上传
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持. 欢迎关注我的公众号米洛的测开日记,获取最新文章教程! 回顾 上一节呢,我们编写了oss的 ...
- 测试平台系列(85) 把redis运用到实战中
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们让支持了前置条件 ...
- 测试平台系列(79) 编写Redis配置功能(下)
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们提出了优化Dao ...
- 测试平台系列(82) 解决APScheduler重复执行的问题
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们编写了在线执行R ...
- 测试平台系列(71) Python定时任务方案
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 定时任务 定时任务,顾名思义: ...
- 测试平台系列(72) 了解ApScheduler基本用法
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们调研了一下市面上 ...
- 测试平台系列(80) 封装Redis客户端
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们编写了Redis ...
随机推荐
- python-查找鞍点
[题目描述]对于给定5X5的整数矩阵,设计算法查找出所有的鞍点的信息(包括鞍点的值和行.列坐标,坐标从1开始). 提示:鞍点的特点:列上最小,行上最大. [练习要求]请给出源代码程序和运行测试结果 ...
- python-爬楼梯
[题目描述] 假设一段楼梯共n(n>1)个台阶,小朋友一步最多能上3个台阶,那么小朋友上这段楼梯一共有多少种方法. [练习要求]请给出源代码程序和运行测试结果,源代码程序要求添加必要的注释. [ ...
- java中StringBuffer的用法
2.StringBuffer StringBuffer:String类同等的类,它允许字符串改变(原因见上一段所说).Overall, this avoids creating many tempor ...
- 【每日日报】第三十四天---Scanner类的应用
1 今天继续看书 Scanner类的应用 1 package File; 2 import java.util.Scanner; 3 4 public class ScannerDemo { 5 pu ...
- window nginx 简单搭建服务器访问静态资源
nginx命令: 启动: start nginx 停止:nginx -s stop || nginx -s quit 注:stop是快速停止nginx,可能并不保存相关信息:quit是完整有序的停止 ...
- EMS修改邮箱容量限制的方法
使用PowerShell命令完成邮箱数据库限制任务. 以Exchange管理员身份打开EMS控制台.在PowerShell命令提示符下,键入如下命令. Set-MailboxDatabase Test ...
- vue 相关问题整理
- 基于Apache Hudi在Google云构建数据湖平台
自从计算机出现以来,我们一直在尝试寻找计算机存储一些信息的方法,存储在计算机上的信息(也称为数据)有多种形式,数据变得如此重要,以至于信息现在已成为触手可及的商品.多年来数据以多种方式存储在计算机中, ...
- 解决hexo报错spwan failed
报错1 FATAL { err: Error: Spawn failed at ChildProcess.<anonymous> (/usr/local/src/hexo/cairbin/ ...
- NodeJS学习日报day4——模块化
// console.log(module); // 执行顺序不同,结果也不同 // module.exports = { // name : 'Cra2iTeT', // hi() { // con ...