接口测试中Groovy引擎的接入实现!
接口测试中Groovy可以作为上下游接口参数化传递的前置脚本和后置脚本使用,无缝衔接Java语法,groovy的引入对于动态参数化的设置方便很多。
其中核心部分就是接入groovy的引擎,下面介绍groovy引擎的实现逻辑。
- pom文件groovy核心依赖
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>3.0.7</version>
</dependency>
<dependency>
<groupId>org.kohsuke</groupId>
<artifactId>groovy-sandbox</artifactId>
<version>1.19</version>
</dependency>
1、Groovy引擎中添加常用的import
静态代码块中引入
一些基础的依赖,比如:JSONObject、JSONArray、JsonPath等工具类
static {
config = new CompilerConfiguration();
// 添加默认import
config.addCompilationCustomizers(new ImportCustomizer().addImports(
"com.taltools.script.exception.StepFailureException",
"com.jayway.jsonpath.JsonPath",
"com.alibaba.fastjson.JSONObject",
"com.alibaba.fastjson.JSONArray",
"groovy.json.JsonSlurper",
"org.apache.commons.codec.digest.DigestUtils",
"org.apache.commons.codec.digest.HmacUtils"));
// 添加线程中断拦截器
config.addCompilationCustomizers(new ASTTransformationCustomizer(ThreadInterrupt.class));
// 添加线程中断拦截器,可中断超时线程,当前定义超时时间为30s
config.addCompilationCustomizers(new ASTTransformationCustomizer(Collections.singletonMap("value", INTERRUPT_TIME_OUT), TimedInterrupt.class));
// 沙盒环境
config.addCompilationCustomizers(new SandboxTransformer());
NO_RUNTIME_SANDBOX = new NoRuntimeSandbox();
NO_SYSTEM_HARM_SANDBOX = new NoSystemHarmSandbox();
}
- 设置缓存容量&过期时间
{
lruCache = CacheBuilder.newBuilder()
.maximumSize(1000) //最大容量
.expireAfterAccess(12, TimeUnit.HOURS) //缓存过期时长
.concurrencyLevel(Runtime.getRuntime().availableProcessors())// 设置并发级别为cpu核心数
.build();
}
2、Groovy核心实现,上下文参数绑定
- 上下文参数变量名绑定
@Override
public ScriptContext runScript(String scriptContent, ScriptContext context) {
if (scriptContent == null || scriptContent.isEmpty()) {
throw new IllegalArgumentException("输入的script内容不能为空");
}
log.debug("执行Groovy脚本: {}", scriptContent);
Binding binding = generateBinding(context);
parseScript(scriptContent, binding).run();
ScriptContext retContext = new ScriptContext();
retContext.setVariables(binding.getVariables());
return retContext;
}
public long getCacheCount() {
return lruCache.size();
}
protected Script parseScript(String scriptContent, Binding binding) {
String md5 = DigestUtils.md5Hex(scriptContent);
String sha1 = DigestUtils.sha1Hex(scriptContent);
String key = md5 + "-" + sha1;
Class<? extends Script> scriptClass = lruCache.getIfPresent(key);
if (scriptClass == null) {
registerSandbox();
GroovyShell shell = new GroovyShell(config);
Script script = shell.parse(scriptContent);
scriptClass = script.getClass();
lruCache.put(key, scriptClass);
log.debug("未命中脚本LRU缓存,创建脚步对象并存入缓存,当前缓存数量: {}", getCacheCount());
} else {
log.debug("命中脚本LRU缓存, key: {}, 当前缓存数量: {}", key, getCacheCount());
}
return InvokerHelper.createScript(scriptClass, binding);
}
3、调佣Groovy引擎设置参数名测试
- 在单元测试中测试接受groovy脚本的返回值
@Test
public void testGroovy(){
String req = " outParams['name'] = testGroovy();\n" +
" static String testGroovy(){\n" +
" def name = 'java'\n" +
" def greeting = \"Hello ${name}\"\n" +
" return greeting\n" +
" }";
GroovyEngine engine = new GroovyEngine();
ScriptContext context = new ScriptContext();
LinkedHashMap<String, Object> outParams = new LinkedHashMap<>();
context.setVariable("outParams",outParams);
ScriptContext ret = engine.runScript(req,context);
System.out.println(JsonUtils.obj2json(ret));
System.out.println(outParams);
}
- 控制台打印结果
更多测试技术分享、学习资源以及一些其他福利可关注公众号:【Coding测试】获取:

接口测试中Groovy引擎的接入实现!的更多相关文章
- HttpClient在HTTP协议接口测试中的使用
TTP协议的接口测试中,使用到最多的就是GET请求与POST请求,其中POST请求有FORM参数提交请求与RAW请求,下面我将结合HttpClient来实现一下这三种形式: 一.GET请求: GET请 ...
- MySQL中innodb引擎分析(初始化)
MySQL的存储引擎是以插件形式工作的,这应该是MySQL的一大特色了吧! 依据<深入理解MySQL>的内容,5.1版本号时存储引擎的插件化都还不是彻底,确切的说是刚加入的特性.为MySQ ...
- PHP中Smarty引擎的常用语法
PHP中Smarty引擎的常用语法 输出今天的日期: {$smarty.now|date_format:"%H:%M %A, %B %e, %Y"} 实际上用到了PHP的time( ...
- express依赖中模块引擎的使用
express中模块引擎的切换 4.x 示例: 如果要将默认的模块引擎切换至指定的模块引擎,用layout render.get('/',function(req,res,next){ res.ren ...
- python nose测试框架全面介绍八---接口测试中非法参数的断言
在测接口时,会有这样的场景,输入非法的参数,校验返回的错误码及错误内容 通常做法为发请求,将错误的返回结果拿出,再进行对比匹配:但存在一个问题,需要再写错误返回分析函数,不能与之前正常发请求的函数共用 ...
- Python实现接口测试中的常见四种Post请求数据
前情: 在日常的接口测试工作中,模拟接口请求通常有两种方法, 利用工具来模拟,比如fiddler,postman,poster,soapUI等 利用代码来模拟,使用到一些网络模块,比如HttpClie ...
- 关于 underscore 中模板引擎的应用演示样例
//关于 underscore 中模板引擎的应用演示样例 <!doctype html> <html> <head> <meta charset=" ...
- 接口测试中模拟post四种请求数据
https://www.jianshu.com/p/3b6d7aa2043a 一.背景介绍 在日常的接口测试工作中,模拟接口请求通常有两种方法,fiddler模拟和HttpClient模拟. Fidd ...
- 从0开发3D引擎(十):使用领域驱动设计,从最小3D程序中提炼引擎(上)
目录 上一篇博文 下一篇博文 前置知识 回顾上文 最小3D程序完整代码地址 通用语言 将会在本文解决的不足之处 本文流程 解释本文使用的领域驱动设计的一些概念 本文的领域驱动设计选型 设计 引擎名 识 ...
- 从0开发3D引擎(十一):使用领域驱动设计,从最小3D程序中提炼引擎(第二部分)
目录 上一篇博文 本文流程 回顾上文 解释基本的操作 开始实现 准备 建立代码的文件夹结构,约定模块文件的命名规则 模块文件的命名原则 一级和二级文件夹 api_layer的文件夹 applicati ...
随机推荐
- Python开发中,SQLAlchemy 的同步操作和异步操作封装,以及常规CRUD的处理。
在我们使用Python来和数据库打交道中,SQLAlchemy是一个非常不错的ORM工具,通过它我们可以很好的实现多种数据库的统一模型接入,而且它提供了非常多的特性,通过结合不同的数据库驱动,我们可以 ...
- Oracle数据库自动备份
1.bat脚本 格式为ANSI格式 set CURDATE=%date:~0,4%%date:~5,2%%date:~8,2% set CURMON=%date:~0,4%%date:~5,2% se ...
- Python 项目及依赖管理工具技术选型
Python 项目及依赖管理工具,类似于 Java 中的 Maven 与 Node 中的 npm + webpack,在开发和维护项目时起着重要的作用.使用适当的依赖管理工具可以显著提高开发效率,减少 ...
- Java并发之volatile关键字内存可见性问题
Java并发之volatile关键字内存可见性问题 线程之间数据共享案例 我们先来看一个场景: Main函数启动后,调用一个线程向list中添加数据.List的size为5的时候,设置变量flag为t ...
- [Udemy] AWS Certified Data Analytics Specialty - 3.Processing
Lambda Lambda 经常起胶水的作用,就是粘合不同的service. 如下图例子 另外Requirement #1 也是一个例子,还有Requirement #3 除了Kinesis Data ...
- Seata 四大模式详解
分布式事务 参考文章: 分布式事务实战方案汇总 https://www.cnblogs.com/yizhiamumu/p/16625677.html 分布式事务原理及解决方案案例https://www ...
- Redis过期策略以及Redis的内存淘汰机制
此篇介绍了Redis过期策略以及Redis的内存淘汰机制,从内存淘汰的8种策略,如何开启内存淘汰策略到如何选择合适的淘汰策略,对Redis的内存淘汰机制做了全方位的阐述 如何高效的使用内存对于redi ...
- 前端微服务qiankun 2.x主子应用通信代码片段
主应用代码 主应用工程里面源代码新建qiankun/index.js,通信代码如下: import { initGlobalState } from "qiankun"; impo ...
- CSS & JS Effect – Button Hover Bling Bling Effect
效果 原理 一眼看上去, background 有渐变颜色 linear-gradient. 当 hover in 的时候有一束白光, 从右边移动到左边. hover out 则是反过来. 它其实是通 ...
- SuperMap iManager云套件数据动态更新刷新地图与数据服务
一.使用背景 有这么一个需求,后端也就通过SuperMap iDesktop或数据库更新了新增或更新某个数据地理信息后,云套件SuperMap iManager中的服务没有更新,无法实时查看到更新的数 ...