接口测试中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引擎的接入实现!的更多相关文章

  1. HttpClient在HTTP协议接口测试中的使用

    TTP协议的接口测试中,使用到最多的就是GET请求与POST请求,其中POST请求有FORM参数提交请求与RAW请求,下面我将结合HttpClient来实现一下这三种形式: 一.GET请求: GET请 ...

  2. MySQL中innodb引擎分析(初始化)

    MySQL的存储引擎是以插件形式工作的,这应该是MySQL的一大特色了吧! 依据<深入理解MySQL>的内容,5.1版本号时存储引擎的插件化都还不是彻底,确切的说是刚加入的特性.为MySQ ...

  3. PHP中Smarty引擎的常用语法

    PHP中Smarty引擎的常用语法 输出今天的日期: {$smarty.now|date_format:"%H:%M %A, %B %e, %Y"} 实际上用到了PHP的time( ...

  4. express依赖中模块引擎的使用

    express中模块引擎的切换 4.x 示例: 如果要将默认的模块引擎切换至指定的模块引擎,用layout render.get('/',function(req,res,next){ res.ren ...

  5. python nose测试框架全面介绍八---接口测试中非法参数的断言

    在测接口时,会有这样的场景,输入非法的参数,校验返回的错误码及错误内容 通常做法为发请求,将错误的返回结果拿出,再进行对比匹配:但存在一个问题,需要再写错误返回分析函数,不能与之前正常发请求的函数共用 ...

  6. Python实现接口测试中的常见四种Post请求数据

    前情: 在日常的接口测试工作中,模拟接口请求通常有两种方法, 利用工具来模拟,比如fiddler,postman,poster,soapUI等 利用代码来模拟,使用到一些网络模块,比如HttpClie ...

  7. 关于 underscore 中模板引擎的应用演示样例

    //关于 underscore 中模板引擎的应用演示样例 <!doctype html> <html> <head> <meta charset=" ...

  8. 接口测试中模拟post四种请求数据

    https://www.jianshu.com/p/3b6d7aa2043a 一.背景介绍 在日常的接口测试工作中,模拟接口请求通常有两种方法,fiddler模拟和HttpClient模拟. Fidd ...

  9. 从0开发3D引擎(十):使用领域驱动设计,从最小3D程序中提炼引擎(上)

    目录 上一篇博文 下一篇博文 前置知识 回顾上文 最小3D程序完整代码地址 通用语言 将会在本文解决的不足之处 本文流程 解释本文使用的领域驱动设计的一些概念 本文的领域驱动设计选型 设计 引擎名 识 ...

  10. 从0开发3D引擎(十一):使用领域驱动设计,从最小3D程序中提炼引擎(第二部分)

    目录 上一篇博文 本文流程 回顾上文 解释基本的操作 开始实现 准备 建立代码的文件夹结构,约定模块文件的命名规则 模块文件的命名原则 一级和二级文件夹 api_layer的文件夹 applicati ...

随机推荐

  1. [计算机网络] IPv6

    1 IPv6 概述 引言 近期突发奇想,能不能用 IPv6 的公网地址,给家里的 NAS 做 内网穿透. 技术上是可行的.只是必须确保是 IPv6 的公网地址. 大学学的 IPv6 的知识,早就抛到九 ...

  2. 基于docker搭建单机测试ELK

    说明:本次使用的windows系统,利用vm进行安装虚拟机,安装的只是单测试单机版elk. 一.下载vm 自行官网下载 二.安装centos7系统 自己有现成的镜像跳过,没有自行查找资料完成 三.进行 ...

  3. Playwright 浏览器窗口最大化

    实现方式 浏览器启动时,加参数 args=['--start-maximized']: 创建上下文时,加参数 no_viewport=True. from playwright.sync_api im ...

  4. 【Mac渗透测试】之SQL注入Demo

    目录: 一.下载安装sqlmap 二.SQL注入 三.参考文章 一.下载安装sqlmap 1.官网地址:http://sqlmap.org/#download git下载: git clone --d ...

  5. vue3+ts Axios封装与使用

    创建完vue3 项目后 新版本:动态控制是否显示加载动画.是否需要判断重复请求.https://www.cnblogs.com/lovejielive/p/17676856.html 一,安装Axio ...

  6. 第二章:智能Agent

    第二章:智能Agent 本章讨论Agent的本质,Agent是否完美,环境的多样性,及由此带来的各种Agent分类. 1. Agnet和环境 Agent通过传感器感知环境并通过执行器对所处环境产生影响 ...

  7. Angular 18+ 高级教程 – Component 组件 の Dynamic Component 动态组件

    前言 Angular 是 MVVM 框架. MVVM 的宗旨是 "不要直接操作 DOM". 为了这个 "不要直接操作 DOM",我们已经讲了 2 篇文章了. 第 ...

  8. Spring —— AOP(面向切面编程)

    AOP(Aspect Oriented Programming)简介 面向切面编程,一种编程范式,指导开发者如何组织程序结构 作用:在不惊动原始设计的基础上为其进行功能增强 Spring理念:无入侵式 ...

  9. LeetCode 1000. Minimum Cost to Merge Stones (区间 DP)

    根据寒神题解 https://leetcode.com/problems/minimum-cost-to-merge-stones/discuss/247567/JavaC%2B%2BPython-D ...

  10. USB编码方式(NRZI)及时钟同步方式

    1.概述 在同步通讯系统中,两个设备通讯则需要同步信号,同步信号分为时钟同步信号和自同步信号两种,时钟同步方式在通讯链路上具有时钟信号(IIC.SPI),自同步方式在通讯链路中没有同步信号(PCIE. ...