java8实战
‘壹’ 实战|java 测试覆盖率 Jacoco 插桩的不同形式总结和踩坑记录
本文为霍格沃兹测试学院优秀学员对 Jacoco 的总结和对使用过程中可能遇到的坑点记录。测试开发进阶学习,文末加群。
一、概述
测试覆盖率是老生常谈的话题。本文主要关注Java后端的测试覆盖率。由于历史原因,公司基本不做单元测试(UT),因此我们更关心手工执行、接口执行(人工使用Postman等)、接口自动化、WebUI自动化对应用系统的覆盖度。
尽管Jacoco已流行多年,各种文档和帖子描述得很详细,但大多数文章都是针对特定形式的总结和使用方法。负责整个公司项目的覆盖率任务的人们需要一一研究和应对,经历多次入坑、出坑。
今年上半年负责公司不同类型的项目覆盖率统计技术的适配,对不同形式的项目有了一定的了解,记录下来,希望对他人有所帮助。本文由个人能力有限、表达能力有限所写,如有错误,欢迎指正。
二、投入覆盖率之前的思路
了解了Jacoco的部分机制,知道它提供了许多强大的功能,以满足不同形式的项目需求。Jacoco提供了API,可以屏蔽不同类型项目带来的困扰。
官方API示例地址:Jacoco.org/Jacoco/trunk...
使用API进行操作的好处包括:
- 屏蔽不同方式的构建部署。若想将此功能集成到平台中,API无疑是很好的方式。
- 只需将Jacoco插桩到测试服务器上,暴露TCP IP和端口,剩余提取代码执行数据、生成覆盖率报告,就可以统一方式执行。
- Jacoco官方提供了Maven插件方式、Ant的XML方式,均有对应的mp和report进行覆盖率数据的mp和报告生成。
三、项目梳理
公司是个老牌公司,项目杂乱无章,技术五花八门,至今仍有使用JDK6的项目。影响Jacoco使用过程的因素可能包括:
- JDK版本:公司使用JDK6、7、8,JDK6是个分水岭,其他版本基本可用JDK8适配。
- 构建方式:Maven构建、ANT构建,也有使用Gradle的可能。
- 启动方式:Java -jar启动、通过命令行启动、使用Tomcat启动WAR包(打包方式灵活)。
- 部署场景:线上部署、测试部署、开发部署可能采用不同方式,开发者多倾向于使用插件方式启动,因为快速且集成IDE。
四、Jacoco插桩的本质
Jacoco介入部署过程的本质是插桩,可以是编译时插桩或运行时插桩。选择on-the-fly模式。
本质在于,在应用启动过程中,让Jacoco相关工具介入部署过程,即介入class文件的加载,在加载class时动态改变字节码结构,插入Jacoco的探针。以TCPserver方式进行插桩,应用启动时在端口上开启TCP服务,接收执行覆盖率信息并保存。提供API连接TCP服务,进行覆盖率数据的mp操作。
五、不同形式的插桩配置
介入启动过程需要一个jar包:Jacocoagent.jar。配置需要介入的jar包路径、过滤class文件、TCPserver端口号、访问地址等。针对不同启动方式,需要在相应的启动参数中加入配置,如在java命令、war包启动、Maven命令、ANT构建、Java -jar启动时加入相应的配置参数。
六、注意事项汇总
在配置过程中,需注意端口管理、变量作用域、代码适配性等问题,确保配置的正确性和兼容性。
七、说给想做平台的你
对于想做增量覆盖率的平台,需要自动化配置,集成devops平台,规划端口,使用API进行数据收集,确保不同启动方式的兼容性。
八、一些坑
在配置Ant构建时,确保compile阶段配置正确,避免数据无法注入。在多服务器部署负载均衡时,需要循环连接不同服务器的IP:port进行数据收集。确保编译环境的一致性,可以使用sftp下载代码。注意数据的及时保存和收集,防止覆盖率数据丢失或不准确。
九、补充API相关代码覆盖率数据的获取
可以封装覆盖率数据生成报告时所需的属性,如数据文件、源码、class文件等,生成报告时自动获取这些信息。若需要具体实现代码示例或获取更多代码,请参阅GitHub仓库。
十、总结
本文是对Java端覆盖率探索的细化总结,参考了相关资料和课程。期待与大家分享和探讨,共同进步。
‘贰’ Java Web开发实战—Listener详解—Listener简介、Listener开发、Listener的API、Listener应用
深入探索Java Web开发实战:Listener的奥秘
在Java Web开发的世界里,Listener扮演着至关重要的角色,它如同后台的观察者,默默地监听并响应Web应用程序中的各种关键事件。本篇文章将带你走进Listener的世界,从基础概念、开发实践到API应用,一一详解。
Listener基础与机制
Listener的核心在于其监听机制,它通过8种接口监听Web应用中的ServletContext、HttpSession和ServletRequest事件。在Eclipse中,只需选择对应的接口,如默认的javax.servlet.ServletContextListener,即可创建Listener,如TestListener01,它将自动配置到web.xml中,确保监听器的执行顺序。
创建Listener实战
- 在Eclipse中,选择Listener接口,如TestListener01,勾选后自动生成相应的类,Eclipse会自动在web.xml中添加和元素,支持多Listener配置。
Listener接口详解
Java EE提供了一系列强大的Listener接口,如ServletContextListener关注ServletContext的生命周期,而则关注属性的增删改。重点掌握这两大接口,如contextInitialized和contextDestroyed,分别在ServletContext创建和销毁时触发。
示例代码展示
- contextInitialized(ServletContextEvent): 当ServletContext创建时,执行TestListener01的初始化逻辑,控制台输出"ServletContext对象被创建了"。
- contextDestroyed(ServletContextEvent): ServletContext销毁时,执行销毁逻辑,控制台输出"ServletContext对象被销毁了"。
后续的Listener接口如HttpSessionListener和ServletRequestListener同样具有类似的生命周期方法,如sessionCreated(HttpSessionEvent)和requestInitialized(ServletRequestEvent),它们各自负责监听和操作相应的生命周期事件。
Listener应用实战
例如,我们可以创建一个名为TestListener09的类,继承HttpSessionBindingListener,用于存储用户信息。结合UserInfo单例模式,实现在线用户的管理。在Servlet中,监听用户登录和登出事件,实时更新显示信息。
小结与提升
通过理解Listener的原理和使用方法,你能灵活地编写程序实现Web应用的特殊功能,如用户登录状态管理、会话统计等。在Context的jsp目录中,实践这些Listener的应用,例如,jsp01.jsp通过JSTL展示用户信息,Servlet08的删除操作则触发TestListener09中的清理逻辑。重启Tomcat,一步步见证Listener的力量。
总而言之,掌握Listener是Java Web开发不可或缺的一部分,它能让你的应用更为智能,更加灵活。深入理解Listener的接口、机制和应用,将为你的Web开发之路增添无限可能。