• -jar 参数启动的话需要把 agent 的 jar 包加入 bootclasspath 哦,github 空间里的 wiki 有介绍,有问题可以先看看 wiki

  • 感谢使用,github 有邮件通知,有问题欢迎到空间里提 issue,一般都会看的

  • 是的,所以我这个 agent 专门支持了热部署和热卸载,如果不得已要在线上调试的话,可以找业务低谷时段放上去用

  • 没错,我就是研究了 jacoco 后发现在上面二次开发也没法满足我的要求,所以就从 0 写了

  • 请务必使用一下,如果确实发现你的某条分支未检测到执行覆盖的话,可以给我提 issue。我会很感激帮我完善工具的行为。

  • 谢谢。
    覆盖率这个东西,越做到后面越印证了那句话,测试三分靠技术,七分靠管理。完整的解决方案必须要结合管理手段来实现的。所以有问题的话欢迎一起探讨,如有对工具有更多需要的功能,也可以到 github 上给我提 issue,我看到后会在业余时间抽空给工具添加上的。

  • 感觉我很合适,testerhome 里有几篇文章,可以点我资料看看。

    不过可能不太方便挪窝,有远程岗位吗?

  • 能完整的看一遍再发言吗?至少把限定语境看一下吧。关于安全性,本身就是个开源软件,有问题提出来打补丁就行了,没什么好说的。关于性能,劳烦看一下 GH 上的 wiki。

    生产中有没有别人用我不知道,不过你这话倒让我回忆起了一点往事,当年我也是准备买商业工具来做这个事情的,谈了个供应商,效果大概也是我这样,然后工具要价 50w,每测试人员每 license 要价 5w(都是买断的一口价),我觉得贵了,才自己做了一个。

  • 1、请确保将 build/libs 下的所有 jar 都放到了你指定的目录中,除了 remote-debug-agent.jar 外,应该还有十几个 jar,你所述的 Exception 所描述的类是在 asm 开头的几个 jar 包里。

    2、可以描述一下你的环境,或者贴出完整的报错吗(到我的 github 提 issue 也行)?有多种情况可能造成 ClassNotFoundException,可能跟 jvm 本身的类加载规则有关。比如一些使用-jar 参数启动的情况下,或者环境不使用 jdk 自带的 AppClassLoader 时(比如 Scala)。可以试一下将 remote-debug-agent.jar 加入到 bootclasspath 中(java 命令行带上参数 -Xbootclasspath/a:${你的目录}/remote-debug-agent.jar)

    这篇文章确实写得比较简陋😅 ,近期我也打算写一下更详细的使用说明,或者 wiki。欢迎持续关注本工具。

  • 本工具从设计上来说,是以调用者为记录的粒度的,不是以某一个请求为粒度,所以可能无法以你描述的视角来做这个事情。或者说我的工具侧重的是调试或测试,你说的场景有点侧重于运行监控。

    当然从我的视角出发也可以实现你所说的效果。前面我介绍得有点简单,实际上探针提供了一组灵活的 api 供使用。如果访问http://ip:8098/trace/地址可以看到我实际提供了 start、stop、list、clean 4 个 api,你可以先调用 start 接口,然后发送请求 A,然后调用 list 得到 A 执行的方法,之后调用 clean 接口,可清空你这个调用者之前记录的数据,再发送请求 B,再调 list 即可得到 B 执行的方法。

    我应该写个类似 wiki 之类的东西的,但是一直没找到时间。我以后会慢慢补充文档的。

  • 默认是用的客户端 IP 作为身份标识。

    以 servlet 架构的应用为例,探针会注入一些逻辑到 HttpServlet.service 方法内,在方法进入时从 HttpServletRequest 对象中提取客户端 IP,然后将其与当前线程绑定,在方法退出前解绑,这样在一个线程有绑定身份的期间,其执行的代码就能记录到该身份下。

    因此在测试客户端能固定 IP 的环境下是比较好用的,如果不能固定 IP 的话,也可以用请求 header 中的信息标识调用者身份,需要继承我准备的一个接口做一些开发,详细可以看 github 里的介绍。

  • 感谢大佬点评。

    1、影子数据库目前是我的一个设想,还未实现。大概就是对 jdbc 驱动进行注入,将一些 dml 语句作用到影子表中,保护原表数据,这样可以用生产环境硬件的算力来做性能测试。其实影子数据库跟测试覆盖率一样,只是可以用这个 agent 做的更多的事情中的一个吧。原谅我初来乍到,不是很清楚应该把这个帖子放哪个分类里,就选了个测试覆盖率。

    2、代码着色确实我在实际项目中有运用,但是这个功能跟 javaagent 是完全解耦的,就没有放在一起展示。其实从我给出的 json 例子应该能看出,只要再能获得被测系统源代码,并且辅以一些算法的话,做出代码染色效果来应该不难。不过实际项目的经验告诉我,这个实现起来跟具体源代码的管理方式有较大的关系,比如我们用的是 svn,那我就得用 svn 的客户端工具写一些接口交互算法,另外某些项目有多个集成分支,也得写算法去获得与发到集成环境的 class 版本对应的源代码。感觉都是非常定制化的操作,目前我也暂时没办法整理出一个可独立开源出来的模块,所以这里就没有细说。

    3、接 2,确实可能后续我再整理一下,贴个思路和效果图出来比较好

  • 感谢回复。

    jacoco 主要适用于单元测试阶段,我这个工具主要用于集成测试阶段,这是最大的区别。具体来说 jacoco 只记录 “jvm 里运行了什么”,而我的工具记录的是 “谁在 jvm 里运行了什么”。不管你是开发还是测试,只要在集成阶段需要知道这个信息的话,就适合用本工具。

    另外一些小的区别:jacoco 只记录代码运行的痕迹,本工具会记录更多的信息以助于调试,比如方法运行时长,参数和返回值,sql 语句等。对于测试覆盖率的话,因为我会 dump 类的行号表下来,所以生成覆盖率时不需要 class 文件,jacoco 我记得是需要的。另外我为方便调试提供的 api,jacoco 也是没有的。

    最后 jacoco 是个非常好的工具,我从它的源代码里学到了很多,当然最终是为了突破它的一些局限性才做出的这个工具。