# 《高性能脱敏组件》测试验证-第01节:高性能脱敏组件单元测试场景验证
作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)
沉淀,成长,突破,帮助他人,成就自我。
- 本章难度:★★☆☆☆
- 本章重点:对高性能脱敏组件实现的脱敏功能进行单元测试,从全局角度掌握高性能脱敏组件对敏感信息和隐私数据脱敏的核心设计思路和设计方法。重点掌握通用中间件项目的设计思路和设计方法,并能够将其灵活应用到自身实际项目中。
大家好,我是冰河~~
截止到目前,我们已经实现了高性能脱敏组件最基础与最核心的功能,能够对绝大部分场景下的敏感信息和隐私数据进行脱敏操作,以避免这些数据被泄露。并且在实现高性能脱敏组件时,提供了三种对接方式:通用方法方式、注解接入方式和日志接入方法。接下来,就对高性能脱敏组件实现的功能进行单元测试。
# 一、前言
在需求设计篇章,我们梳理了为何学习高性能脱敏组件,阐述了高性能脱敏组件的目标与挑战,对设计高性能脱敏组件面对的挑战给出了详细的应对方案,并且从功能性需求和非功能性需求等方面详细梳理了高性能脱敏组件的需求。
在架构设计篇章,详细阐述了高性能脱敏组件的方案目标、技术选型和总体架构设计。并且对高性能脱敏组件的通用化落地方案进行了简单的说明。
在脱敏设计篇章,我们已经对高性能脱敏组件进行了编码设计和实现,目前,已经对注解、接口与顶层抽象类进行了设计和实现,并且对高性能脱敏组件的通用脱敏方法和注解的通用解析逻辑以及内置的各种常见数据脱敏器进行了设计和实现,同时,基于高性能脱敏组件的通用脱敏方法对日志脱敏进行了拓展设计和实现。接下来,就对高性能脱敏组件实现的功能进行单元测试。
# 二、本节诉求
对高性能脱敏组件实现的脱敏功能进行单元测试,从全局角度掌握高性能脱敏组件对敏感信息和隐私数据脱敏的核心设计思路和设计方法。重点掌握通用中间件项目的设计思路和设计方法,并能够将其灵活应用到自身实际项目中。
# 三、单元测试验证
本节,会分别对高性能脱敏组件的通用方法接入、注解方式接入和日志方式接入进行单元测试。
# 3.1 创建测试模型
为了更好的进行单元测试,在正式进行单元测试之前,创建几个用于测试的数据模型。
(1)创建TestABClass类
源码详见:io.binghe.framework.shield.test.model.TestABClass。
@ShieldClass
public class TestABClass {
@ShieldField(method = ShieldMethodEnum.CUSTOMIZE, addition = {"3", "4", "0"})
private String a;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
(2)创建TestAClass类
源码详见:io.binghe.framework.shield.test.model.TestAClass。
@ShieldClass
public class TestAClass {
@ShieldField(method = ShieldMethodEnum.ALL)
private String a;
@ShieldField(method = ShieldMethodEnum.CUSTOMIZE, addition = {"3", "4", "0"})
private String b;
@ShieldField(method = ShieldMethodEnum.CUSTOMIZE, addition = {"3", "4", "0"})
private Integer bint;
@ShieldField(method = ShieldMethodEnum.CUSTOMIZE, addition = {"3", "4", "0"})
private Long blong;
@ShieldField(method = ShieldMethodEnum.CLEAN)
private String c;
@ShieldField(method = ShieldMethodEnum.CUSTOMIZE, addition = {"3", "4", "0"})
private List<String> d;
@ShieldField(method = ShieldMethodEnum.CUSTOMIZE, addition = {"3", "4", "0"})
private Map<String, String> e;
private TestABClass testABClass;
/*****************省略get/set方法***************/
@Override
public String toString() {
return "TestAClass{" +
"a='" + a + '\'' +
", b='" + b + '\'' +
", bint=" + bint +
", blong=" + blong +
", c='" + c + '\'' +
", d=" + d +
", e=" + e +
", testABClass=" + testABClass +
'}';
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
(3)创建TestBClass类
源码详见:io.binghe.framework.shield.test.model.TestBClass。
public class TestBClass {
private String a;
private String b;
private Integer bint;
private Long blong;
private String c;
/*****************省略get/set方法***************/
}
2
3
4
5
6
7
8
# 3.2 测试通用方法脱敏
创建SensitiveDataUtilsTest类对高性能脱敏组件的通用方法脱敏功能进行单元测试。
源码详见:io.binghe.framework.shield.test.SensitiveDataUtilsTest。
public class SensitiveDataUtilsTest {
@Test
public void testSensitiveDataUtils() {
Assert.assertEquals("123***7890", SensitiveDataUtils.customizeHide("12345667890", 3,4,3));
Assert.assertEquals("****7890", SensitiveDataUtils.customizeHide("12345667890", 0,4,4));
Assert.assertEquals("*******7890", SensitiveDataUtils.customizeHide("12345667890", 0,4,0));
Assert.assertEquals("123********", SensitiveDataUtils.customizeHide("12345667890", 3,0,8));
Assert.assertEquals("123****", SensitiveDataUtils.customizeHide("12345667890", 3,0,4));
Assert.assertEquals("123****7890", SensitiveDataUtils.customizeHide("12345667890", 3,4,0));
Assert.assertEquals("123", SensitiveDataUtils.customizeHide("123", 3,4,0));
}
}
2
3
4
5
6
7
8
9
10
11
12
运行SensitiveDataUtilsTest类的testSensitiveDataUtils()方法,单元测试通过并输出如下日志。
Process finished with exit code 0
说明高性能脱敏组件的通用方法脱敏功能符合预期。
# 3.3 测试注解方式脱敏
创建ReflectUtilsTest类对高性能脱敏组件的注解方式脱敏功能进行单元测试。
源码详见:io.binghe.framework.shield.test.ReflectUtilsTest。
public class ReflectUtilsTest {
private final Logger logger = LoggerFactory.getLogger(ReflectUtilsTest.class);
@Test
public void testReflectUtils(){
TestAClass aClass = new TestAClass();
aClass.setA("AAAAAAAAAAAAAAAAAAAAAAAA");
aClass.setB("BBBBBBBBBBBBBBBBBBBBBBBB");
aClass.setBint(1234567890);
aClass.setBlong(1234567890L);
aClass.setC("CCCCCCCCCCCCCCCCCCCCCCCC");
aClass.setD(Arrays.asList("DDDDDDDDDDDD", "DDDDDDDDDDDDDD"));
aClass.setE(Map.of("EEEEEEEE", "EEEEEEEE"));
logger.info("aClass1:{}",aClass);
TestABClass abClass = new TestABClass();
abClass.setA("AAAAAAAAAAAAAAAAAAAAAAAAA");
aClass.setTestABClass(abClass);
logger.info("aClass2:{}", ReflectUtils.reflectToLogStringByFields(abClass));
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
运行ReflectUtilsTest类的testReflectUtils()方法,输出如下日志。
[main] INFO i.b.f.shield.test.ReflectUtilsTest - aClass1:TestAClass[a=******;b=BBB*****************BBBB;bint=123***7890;blong=123***7890;d=DDD*****DDDD,DDD*******DDDD,;e={EE************EEE};testABClass=null;]
[main] INFO i.b.f.shield.test.ReflectUtilsTest - aClass2:TestABClass[a=AAA******************AAAA;]
2
说明注解脱敏生效。
# 3.4 测试日志方式脱敏
创建MessageConverterTest类对高性能脱敏组件的日志方式脱敏功能进行单元测试。
源码详见:io.binghe.framework.shield.test.MessageConverterTest。
public class MessageConverterTest {
private final Logger logger = LoggerFactory.getLogger(MessageConverterTest.class);
@Test
public void testMessageConverter() {
TestAClass aClass = new TestAClass();
aClass.setA("AAAAAAAAAAAAAAAAAAAAA");
aClass.setB("BBBBBBBBBBBBBBBBBBBBB");
aClass.setBint(1234567890);
aClass.setBlong(1234567890L);
aClass.setC("CCCCCCCCCCCCCCCCCCCCC");
logger.info("info aClass: {}", aClass);
logger.debug("debug aClass: {}", aClass);
logger.warn("warn aClass: {}", aClass);
logger.error("error aClass: {}", aClass);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
运行MessageConverterTest类的testMessageConverter()方法,输出如下日志。
[main] INFO i.b.f.s.test.MessageConverterTest - info aClass: TestAClass[a=******;b=BBB**************BBBB;bint=123***7890;blong=123***7890;d=null;e=null;testABClass=null;]
[main] WARN i.b.f.s.test.MessageConverterTest - warn aClass: TestAClass[a=******;b=BBB**************BBBB;bint=123***7890;blong=123***7890;d=null;e=null;testABClass=null;]
[main] ERROR i.b.f.s.test.MessageConverterTest - error aClass: TestAClass[a=******;b=BBB**************BBBB;bint=123***7890;blong=123***7890;d=null;e=null;testABClass=null;]
2
3
说明日志脱敏生效。
# 四、本节总结
本节,主要基于高性能脱敏组件的核心功能进行了单元测试,包括对通用方法接入脱敏、注解方式接入脱敏和日志方式接入脱敏进行了单元测试。
最后,可以在评论区写下你学完本章节的收获,祝大家都能学有所成,我们一起搞定高性能脱敏组件。
# 五、如何学习
1.加入 冰河技术 知识星球(文末有知识星球优惠券,即将涨价),才能查看星球专栏文章,学习专栏视频课程,查看星球置顶消息,申请加入项目,才能看到项目代码和技术小册,如果未申请加入项目,点击项目链接,你会发现是404页面。
2.专栏的每一章会对应一个代码分支,学习视频和专栏文章时,大家对照代码分支学习即可。
3.学习过程中最好按照章节顺序来学习,每一章前后都是比较连贯的,并且每一章的代码实现也有先后顺序,这样按照从前往后的顺序学习,最终你会实现一个完整的线程池项目。
注意:学习的过程,不是复制粘贴代码的过程,赋值粘贴代码是没有任何意义的,最好的学习方式就是自己动手实现代码,然后思考、总结。
4.代码结构:master分支是最新的全量代码,专栏中每一个章节和视频都会对应一个代码分支,切换到章节对应的代码分支后,即可根据当前章节和视频学习对应的代码实现,不然,在master分支中看到的是全量的代码。
5.对应代码实现上的问题,可以在专栏对应的源码提issuse。
6.冰河会为《高性能脱敏组件》专栏录制完整的视频课程。
# 六、写在最后
在冰河的知识星球除了高性能脱敏组件项目和热更的RPC视频外,还有其他十几个项目,像DeepSeek大模型、手写线程池、手写高性能SQL引擎、手写高性能Polaris网关、手写高性能熔断组件、手写通用指标上报组件、手写高性能数据库路由组件、手写分布式IM即时通讯系统、手写Seckill分布式秒杀系统、手写高性能RPC、实战高并发设计模式、简易商城系统等等,这些项目的需求、方案、架构、落地等均来自互联网真实业务场景,让你真正学到互联网大厂的业务与技术落地方案,并将其有效转化为自己的知识储备。
值得一提的是:冰河自研的Polaris高性能网关比某些开源网关项目性能更高,并且冰河也正在为企业级高性能RPC框架录制视频,全程带你分析原理和手撸代码。 你还在等啥?不少小伙伴经过星球硬核技术和项目的历练,早已成功跳槽加薪,实现薪资翻倍,而你,还在原地踏步,抱怨大环境不好。抛弃焦虑和抱怨,我们一起塌下心来沉淀硬核技术和项目,让自己的薪资更上一层楼。

目前,领券加入星球就可以跟冰河一起学习《DeepSeek大模型》、《手写线程池》、《手写高性能SQL引擎》、《手写高性能Polaris网关》、《手写高性能RPC项目》、《分布式Seckill秒杀系统》、《分布式IM即时通讯系统》《手写高性能通用熔断组件项目》、《手写高性能通用监控指标上报组件》、《手写高性能数据库路由组件》、《手写简易商城脚手架项目》、《Spring6核心技术与源码解析》和《实战高并发设计模式》,从零开始介绍原理、设计架构、手撸代码。
花很少的钱就能学这么多硬核技术、中间件项目和大厂秒杀系统与分布式IM即时通讯系统,比其他培训机构不知便宜多少倍,硬核多少倍,如果是我,我会买他个十年!
加入要趁早,后续还会随着项目和加入的人数涨价,而且只会涨,不会降,先加入的小伙伴就是赚到。
另外,还有一个限时福利,邀请一个小伙伴加入,冰河就会给一笔 分享有奖 ,有些小伙伴都邀请了50+人,早就回本了!
# 七、其他方式加入星球
- 链接 :打开链接 http://m6z.cn/6aeFbs 加入星球。
- 回复 :在公众号 冰河技术 回复 星球 领取优惠券加入星球。
特别提醒: 苹果用户进圈或续费,请加微信 hacker_binghe 扫二维码,或者去公众号 冰河技术 回复 星球 扫二维码加入星球。
好了,今天就到这儿吧,我是冰河,我们下期见~~