随笔 - 47  文章 - 0  评论 - 449  阅读 - 17万
  2022年1月8日

这是一个40多岁还在编码的老程序员对单元测试的理解和实践。里面没有废话,希望每句话能说到你心坎里。

原则:只测自己

自己的含义:方法边界内的主体逻辑。一切下游方法、框架依赖、外部IO等都不是自己。如spring、 外部数据库都视为外部逻辑。

这一原则的动机

便于定位

每个方法有自己独立的单元测试,这有利于IDE在单元测试与逻辑代码间跳跃,便于定位,并降低代码结构调整的影响范围。

不重复,降低复杂度

因每个方法有自己的单元测试,所以当前测试不要涵盖下游方法的功能测试。以避免逻辑改动造成不必要的影响范围扩大。

实践与建议

要想单元测试更易于维护,良好的设计是前提

分层开发

开发也是可以分层的,先进行框架开发后进行具体开发。如先定义好所有的接口和要传递的数据,并组织好控制层,然后测试和具体开发便可同时展开。这样便可提前发现结构性问题,提前对设计进行验证,减少后期结构性调整对单元测试的影响。

单一职责

尽量应用单一职责设计模式,使逻辑模块化,并使用老板原则将这些模块串起来。这对于类的内部实现尤其重要,因为这会影响单元测试的覆盖能力。

只有这样每个方法的逻辑才能简单,对应的单元测试自然便于维护。作为老板的控制类或方法不必苛求单元测试,可酌情选择是否单元测试,因为控制是少数派,且实质逻辑已经被分摊到模块中。

逻辑与外部IO分离

这是单一职责的延申,数据的加载、处理与输出是可以作为独立的三个职责的。其中数据的加载和输出往往与外部环境依赖有关,本身的测试意义不大,即便测试也不能到处运行,且测试运行效率低下。

所以我们需要将IO逻辑从处理逻辑中剥离,并放到外层的控制逻辑中去并用mock来解决。这样没有外部依赖的处理逻辑——核心,将得到简化,从而单元测试得到简化。

如果中间实在需要外部IO可考虑在IO处进行逻辑拆分,这样拆分后的子逻辑中就没有了IO依赖,从而得到简化。

到处运行

有时候单元测试是脱离不了环境的,如我们想验证一下 SQL 的正确性。此时建议在单元测试上应用 @Disabled 注解,以便在 mvn test 中忽略这些测试,从而保证测试可以到处运行。

@Autowired

请尽量避免对框架的依赖,如 spring 的 @Autowired 注入机制,这会巨幅增加单元测试的构建难度,巨幅增加单元测试的耗时,因为这会对 mock 对象的注入造成困难。

建议,使用构造注入代替属性注入,这样就可以摆脱对 spring 的依赖。

posted @ 2022-01-08 09:49 李学斌 阅读(776) 评论(1) 推荐(0) 编辑
  2021年3月7日
摘要: 本文指出当下服务治理的主要矛盾为:服务单一职责与服务间关系复杂之间的矛盾。其症结在于服务间的控制耦合,并给出了两种解决方法。 阅读全文
posted @ 2021-03-07 11:41 李学斌 阅读(465) 评论(2) 推荐(5) 编辑
  2017年7月6日
摘要: 这次百度大会主要聚焦于AI,以开源加扶持的姿态引流AI发展方向,充分体现百度在AI领域的优势地位。具体体现为发布两款产品:DuerOS 和 apollo,以及丰富的配套服务。 个人认为DuerOS是即个人消费领域PC操作系统和移动操作系统之后,一种具有新的交互体验的操作系统原型。DuerOS是完全基于语音进行交互的,在现场使用过程中虽然还存在着不足,但基本上能够正确理解人类发出的口头指令并能够给出很好的回馈。DuerOS不只是一个语音操作系统,百度还提供了DuerOS的硬件解决方案。家居、玩具等厂商只需要一枚一元硬币大小的芯片就可以享受到DuerOS的能力,这势必会降低整个智能家居的门槛,由此可以想象在接下来的几年里我们生活环境的智能化将发生翻天覆地的变化! 阅读全文
posted @ 2017-07-06 18:59 李学斌 阅读(440) 评论(0) 推荐(0) 编辑
  2016年3月7日
摘要: 18年IT生涯,2年匠心打造,近两万字长文。主要讨论了巨型复杂业务系统的一种构建思路,力图实现决策意志的快速、准确、一致的下传并简化实施成本提供实施效率。通过全业务领域的即时流程编排,实现全网业务IT系统的快速建设与迭代。 阅读全文
posted @ 2016-03-07 09:06 李学斌 阅读(1307) 评论(0) 推荐(5) 编辑
  2014年5月6日
摘要: 请在网上查相关的使用情景,这里直接上要点。另外,可能不只一种方法,但这里只有一种。 阅读全文
posted @ 2014-05-06 09:44 李学斌 阅读(921) 评论(0) 推荐(0) 编辑
  2012年12月26日
摘要: 本文给出了,信息化时代下,大数据量、大规模应用、高并发处理背景下,所有信息系统的协同研究。望同道切磋交流。 阅读全文
posted @ 2012-12-26 11:28 李学斌 阅读(2484) 评论(0) 推荐(1) 编辑
  2012年10月31日
摘要: 本文从生态、关系、动态性、资源、数据、集成等多个方面深入剖析信息时代下应用所带来的问题。 阅读全文
posted @ 2012-10-31 10:03 李学斌 阅读(825) 评论(1) 推荐(1) 编辑
  2012年10月30日
摘要: 德鲁克的《管理实践》中给出了目标管理的方法,从而影响了整个世界,他不仅仅对当时新生的知识工作者的管理给出了建议,同时也影响着个人、家庭、企业、社会等各个层面对生存、发展的深刻认识,因为只要有了目标,才能转化为有意义的行动。为了保障目标的实现和有效控制,大家一般会对目标进行足够的分解,以形成多个相关的过程,这就是过程管理。时至今日,产业正在从劳动密集型向知识密集型产业转变,以前稀有的知识工作者也越来越普及,成熟的技术领域的也被充分细分。目标管理+过程管理+充足的资源为“巨型”的信息系统的诞生提供了基础和保障。 阅读全文
posted @ 2012-10-30 09:57 李学斌 阅读(1025) 评论(0) 推荐(1) 编辑
  2012年5月7日
摘要: 12306春运时的瘫痪距离我们并不是很远,或许我们还在为京东的618的抢购页面无法打开而感到懊恼。好像突然之间电子化的信息如汪洋大海一般充斥到我们的每一个空间,考验着我们的系统。于是分布式的概念深入人心。我们在不断的引入新技术:redis,NoSql,dubbo,hadoop……。 然而我们的改变似乎很缓慢,并不是所有急需改造的系统都能借分布式的东风摇身一变轻松的脱胎换骨,这里面有很多的原因,主要的有: 阅读全文
posted @ 2012-05-07 09:49 李学斌 阅读(2518) 评论(4) 推荐(2) 编辑
  2012年4月26日
摘要: 接前文:狼群的架构暗示 目前人类已经发明了机器人,深蓝也演绎了与人类的对决,这揭示了人类对信息的掌控的范围与能力已经非常强大。但如果我们利用现有技术制造一批机器狼,让它们参加集体围猎行动或个体捕杀活动,我并不表示乐观。 之所以有这个比较,旨在说明作为自然生物的狼在处理信息的多样性、综合性、复杂性上有着杰出的表现。如果狼是个信息处理系统,如此强劲的信息处理能力是如何架设的呢?他的架设原则又是什么呢? 阅读全文
posted @ 2012-04-26 09:12 李学斌 阅读(2522) 评论(2) 推荐(1) 编辑
< 2025年3月 >
23 24 25 26 27 28 1
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 1 2 3 4 5

点击右上角即可分享
微信分享提示