模仿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")

}}}
}

目标说明

  1. 在Fitnesse中编写脚本
  2. 可以输入执行过程中的变量
  3. 可以获取到执行过程中的日志
  4. 可以输出提供给下文的变量

目标实现

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。

如果有疑问可以加入测试讨论群一起讨论。

posted @ 2024-01-22 16:03  月色深潭  阅读(9)  评论(0编辑  收藏  举报