模仿Jmeter,给Fitnesse添加执行脚本(groovy)的能力,变相增加if、for、switch等Fixture。
实验效果
!define script {
{{{
logs.add(v1);
for(int i=0;i<10;i++){
logs.add(i);
}
logs.add(v2);
outMap.put("v3","5555");
logs.add(true||false);
Assert.equals(param,"param123")
}}}
}
目标说明
- 在Fitnesse中编写脚本
- 可以输入执行过程中的变量
- 可以获取到执行过程中的日志
- 可以输出提供给下文的变量
目标实现
1.在Fitnesse中编写脚本
这里可以利用Fintesse提供的能力来编写脚本,下面是官方的说明:
然后将编写的脚本,保存到自定义变量中即可,如上文效果预览中的自定义变量script。
注意
这个变量值,实际是
<br/><pre>
logs.add(v1);
for(int i=0;i<10;i++){
logs.add(i);
}
logs.add(v2);
outMap.put("v3","5555");
logs.add(true||false);
Assert.equals(param,"param123")
</pre>
<br/><br/>
所以获取到该值后,需要在pre节点中提取text值,这个值才是最终的脚本信息
2. 输入和输出
下面是一个供Fixture调用的工具类
- allVariables是传入的所有变量,并通过new Binding(allVariables)进行绑定,这样脚本中可以直接使用这些变量
- outMap是脚本中获取输出变量,利用groovyShell.setProperty("outMap",outMap),供脚本调用
- logs同outMap,供脚本调用
- 内容importInfo.append("import cn.hutool.core.lang.Assert;").append("\n");,目的是在脚本头部,预设import信息,其实也可以在脚本中直接编写,这里的目的是简化脚本编写。
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import own.slim.enjoy.util.EngineUtils;
import java.util.Map;
public class GroovyUtils {
private final static Logger logger = LoggerFactory.getLogger(GroovyUtils.class);
/**
*
* @Description: 执行Fitnesse传递过来的脚本
* @Author:
* @Date: 2024/1/22 14:25
* @param scriptText: 从pre中提取的Text脚本信息
* @param allVariables: fitnesse执行中的变量Map
* @param outMap: 需要输出的变量
* @param logs: 日志,自定义
* @return java.lang.Object
**/
public static Object evaluate(String scriptText, Map<String,String> allVariables, Map<String,Object> outMap, GroovyUtilLog logs){
//添加默认的import
StringBuffer importInfo=new StringBuffer();
importInfo.append("import cn.hutool.core.lang.Assert;").append("\n");
Binding binding=new Binding(allVariables);
GroovyShell groovyShell=new GroovyShell(binding);
groovyShell.setProperty("outMap",outMap);
groovyShell.setProperty("logs",logs);
Object value = groovyShell.evaluate(importInfo+scriptText);
return value;
}
}
3. 日志
日志主要起到一个在Fitnesse中展示的作用,便于调试脚本。所以可以是各种实现,我这边是如下的实现
public class GroovyUtilLog {
private StringBuffer logs;
public GroovyUtilLog(){
logs=new StringBuffer();
}
public void add(Object format,Object... params){
if(format instanceof String){
logs.append(String.format((String)format,params)).append("\n");
}else{
logs.append(format).append("\n");
}
}
public String out(){
return logs.toString();
}
}
最后
根据自己的Fixture编写习惯,编写一个GroovyFixture即可。
其中获取Fitnesse执行中所有的变量(allVariables),也可以不用按照我的实现,可以根据需要,自己提取脚本需要的变量,组建成hashMap即可。如果想提取全部变量,我这边修改了fitnesse的源码,可以参考https://www.cnblogs.com/moonpool/p/11988233.html。
如果有疑问可以加入测试讨论群一起讨论。
本文来自博客园,作者:月色深潭,交流群:733423266,转载请注明原文链接:https://www.cnblogs.com/moonpool/p/17980032