一个非常好的问题。我是工作多年的Web应用架构师,来回答一下这个问题。欢迎关注我,了解更多IT专业知识。
埋点是软件开发中的一个术语,用于采集数据或者验证代码执行过程,不只是Java才有,各种开发语言中都有成熟的SDK开发包和框架使用。
埋点的场景有多种,可以在程序执行时,还有在单元测试时。可以在服务器,也可以在客户端。可以收集程序运行数据,也可以收集用户数据。
重点补充单元测试时用到的埋点技术。
单元测试的目的是测试被测函数。但是被测函数往往不是那么“简单”,首先有入参,其次要依赖使用其它的变量、函数、数据、还有第三方接口,等等。
被测试函数的代码执行路径也会有多个,比如if-else,异常处理。
如何模拟不同的场景,控制被测函数的运行依赖环境,验证运行过程和返回结果是否符合预期?以Java开发为例,使用JUnit + Mockit,一个典型的单元测试组成如下:
1. mock模拟依赖的数据、变量、函数、第三方接口,等等
2. stub打桩埋点,设置期望的执行过程、入参、出参等信息。
3. verify验证代码执行过程,比如埋点的函数被调用了1次,入参是abc。
4. doThrow设置异常抛出,验证异常发生时的处理逻辑是否符合预期。
举个例子,被测试函数parseMsg(),读取ActiveMQ消息内容,转换成JSONObject
1,模拟入参TestMessage
2,在getText()函数处打桩埋点,设置返回值
3,调用被测试函数,验证getText()函数被调用了一次
4,验证异常发生时,处理逻辑是否正确