头图
本文作者陈恒捷是TesterHome社区主编,第十届MTSC大会上海站-开源专场出品人。先后在PP助手、PPmoney、荔枝等公司从事测试效能提升相关工作,在测试技术及效率提升方面有丰富的经验积累。

前言

在去年repeater刚出来的时候,就已经简单体验了一下,也有在公司试用。但由于各种原因,最终没有落地。现在刚好有机会再研究一下,看官方记录 console 终于加上了界面,所以也试用并记录下来。

其它文章链接传送门:

通用流量录制回放工具 jvm-sandbox-repeater 尝鲜记录 (一)
通用流量录制回放工具 jvm-sandbox-repeater 尝鲜 (二)——repeater-console 使用 (已完成)
通用流量录制回放工具 jvm-sandbox-repeater 尝鲜 (三)—— repeater plugin 开发 (完成度 50%)

步骤

由于官方源码有做了比较多调整,所以这次记录还是从零开始。

  • 1、安装 repeater

运行官方仓库下的 bin/install-repeater.sh 即可

  • 2、调整 repeater 模式配置,改为用 console

修改 ~/.sandbox-module/cfg/repeater.properties 的值,repeat.standalone.mode 改为 false

  • 3、调整 console 工程中对应配置

repeater-console/repeater-console-start/src/main/resources/application.properties ,调整 mysql 相关配置,改为和自己本地 mysql 数据库一致

同时请初始化数据库内容,初始化的sql文件在:repeater-console/repeater-console-dal/src/main/resources/database.sql

初始化成功,应该会创建了 repeater 这个数据库,且包括下面四个表:

image.png

  • 4、启动 console 和被测服务

启动被测服务:

4.1、下载示例项目:https://github.com/chenhengji...
4.2、启动示例项目:

# 在示例项目 clone 后的根目录中运行
cd complete 
mvn install && java -jar target/*.jar

启动成功后,应该有类似如下日志:

...
2020-12-28 07:40:45.949  INFO 32158 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2020-12-28 07:40:45.952  INFO 32158 --- [           main] hello.Application                        : Started Application in 2.062 seconds (JVM running for 2.448)

4.3、修复官方仓库里 console 一些代码问题。

4.3.1、把 repeater-console/repeater-console-start/src/main/resources/velocity 下面的所有文件,查找 #parse("/blocks ,统一改替换为 #parse("blocks 。原有代码最前面带上 / 会导致引用找不到报错
4.3.2、修改 repeater-console/repeater-console-start/src/main/java/com/alibaba/repeater/console/start/controller/page/ReplayController.java 中的 return "/replay/detail"; ,改为 return "replay/detail"; ,去掉双引号里面第一个 /
4.3.3、修改 repeater-console/repeater-console-start/src/main/java/com/alibaba/repeater/console/start/controller/test/RegressPageController.java 中的 return "/regress/index"; ,改为 return "regress/index";,去掉双引号里面第一个 /

4.4、启动 console:

# 在 repeater 项目根目录进行
mvn install -DskipTests && java -jar repeater-console/repeater-console-start/target/*.jar

启动成功,应该出现类似下面的日志:

...
2020-12-28 07:40:27.259  INFO 32116 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8001 (http)
2020-12-28 07:40:27.265  INFO 32116 --- [           main] c.a.repeater.console.start.Application   : Started Application in 7.532 seconds (JVM running for 8.065)
  • 5、使用界面化的 console 进行录制回放

打开此 url 即可打开 console 的界面:http://127.0.0.1:8001/regress...

现在,借助界面来做一次录制回放吧。基本套路还是一样的:

5.1、在 console 增加配置,用于对接应用(注意这个和之前纯命令行有点不同,命令行是先完成第二步)
5.2、让 repeater 注入到被测应用,上报数据到 console
5.3、在 console 中操作,进行录制和回放

接下来,一步一步操作。

5.1、在 console 增加配置,用于对接应用

点击左侧的 【配置管理】,添加如下配置:

应用名:unknown
环境:unknown
配置信息

{
  "useTtl" : true,
  "degrade" : false,
  "exceptionThreshold" : 1000,
  "sampleRate" : 10000,
  "pluginsPath" : null,
  "httpEntrancePatterns" : [ "^/greeting.*$" ],
  "javaEntranceBehaviors" : [ {
    "classPattern" : "hello.GreetingController",
    "methodPatterns" : [ "greeting" ],
    "includeSubClasses" : false
  } ],
  "javaSubInvokeBehaviors" : [],
  "pluginIdentities" : [ "http", "java-entrance", "java-subInvoke", "mybatis", "ibatis" ],
  "repeatIdentities" : [ "java", "http" ]
}

点击【保存】,存下配置

5.2、让 repeater 注入到被测应用

sh ~/sandbox/bin/sandbox.sh -p `ps -ef | grep "target/gs-rest-service-0.1.0.jar" | grep -v grep | awk '{print $2}'` -P 12580

然后进入 console 的【在线模块】,应该能看到增加了当前这个被测应用的心跳记录:

5.3、开始录制。给这个被测应用输送一些流量

# 手动发出2条请求
$ curl -s 'http://localhost:8080/greeting'
{"id":1,"content":"Hello, World!"}%
$ curl -s 'http://localhost:8080/greeting?name=User'
{"id":2,"content":"Hello, User!"}%

然后打开 console 的【在线流量】,能看到刚发出的两条请求已经录制下来了:

5.4、回放请求。直接点击第一行末尾的回放按钮,进行回放:

然后,就可以看到回放结果了。稍等几秒后刷新下回放结果界面,就能看到执行结果

由于被测应用实际上 id 自增逻辑没有依赖任何外部服务,每次请求都会自动 +1 ,所以回放记录是失败的。

总结

官方的文档还是一如既往的少,代码里面也有点坑(对 velocity 不熟悉,上面的代码只是按自己理解改的,如果有更正确的修改姿势欢迎分享),界面和技术栈都用的比较小众和比较久远的的(spring-boot 17年已经去掉对 velocity 模板引擎的支持了)。 而且一个批量回放功能还是只有按钮实际没做的。。。

不过也算是给到大家一个真正示例控制台该有的样子,把需要的元素和界面设计都基本给出了。如果想要开箱即用,对 http 接口进行简单的录制回放,可以使用这个带界面的 console 来试用一下。

附录:过程中的报错及解决

1、注入 repeater 到被测应用后,console 报错:

2020-12-28 23:37:28.822 ERROR 39333 --- [nio-8001-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause

java.lang.NullPointerException: null
    at com.alibaba.repeater.console.start.controller.api.ConfigFacadeApi.getConfig(ConfigFacadeApi.java:34) ~[classes!/:na]
    at sun.reflect.GeneratedMethodAccessor77.invoke(Unknown Source) ~[na:na]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_25]

原因:上报心跳包后,appName 和 environment 和配置对不上。
解决:请确认有至少一个配置,appName 和 environment 都是 unknown

2、报错 org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource '/blocks/pager.vm'] with root cause ,且界面打不开

原因:没有按照前面所述修改 console 源码,导致引用其他模板的部分根目录不正确。
解决:按照前面描述,把 #parse("/blocks ,统一改替换为 #parse("blocks 即可。

本文首发于TesterHome社区,点此链接可查看原文并与作者直接交流

今日份的知识已摄入~
想了解更多前沿测试开发技术:欢迎关注「第十届MTSC大会上海站」>>>
1个主会场+12大专场,大咖云集精英齐聚


TesterHome
35 声望20 粉丝

TesterHome社区,测试之家:是由众多测试工程师组织和维护的技术社区,致力于帮助新人成长,提高测试地位,推进质量发展。