淘系用户平台技术团队单元测试建设

简介:单元测试是工程交付前质量保障的第一环,也无疑是软件工程质量保障的重要基石,有效的单元测试能够提前发现90%以上的代码Bug问题,同时也能防止代码的腐化,在工程重构演进时起到至关重要的作用。

作者 | 问元
来源 | 阿里开发者公众号

为什么需要单元测试

纵观优秀的开源工程,完备的单元测试总是必须的条件。通过这些单元测试,我们可以充分了解代码中相关类和方法的作用和核心逻辑,熟悉各种场景的运行情况。同时也因为有了单元测试,开源作者在接受各种feature的代码提交时才有稳定安全的保障。其实单元测试的重要性所有开发同学应该都了然于胸,同样TDD(测试驱动开发)也不是一个新的概念,但是真当我们落地实践时,又总会找出各种各样的理由来劝服自己下次一定好好写单元测试,这一次先放过自己。这些理由无外乎,开发周期太紧了; 测试同学能保证功能正确性;写单元测试代码量比业务代码还大; 又不是不能跑。所以虽然我们总是在追逐工程师文化,却又时不时放纵在放弃工程师底蕴的路上。

单元测试是工程交付前质量保障的第一环,也无疑是软件工程质量保障的重要基石,有效的单元测试能够提前发现90%以上的代码Bug问题,同时也能防止代码的腐化,在工程重构演进时起到至关重要的作用。

怎么写单元测试

好的单元测试的几个要点

摘自阿里巴巴开发规约

  • 单元测试必须遵守AIR原则,单元测试必须具备Automatic(自动化),Independent(独立性),Repeatable(可重复)性;
  • 单元测试应该是全自动执行的,并且非交互式的。测试用例通常是被定期执行的,执行过程必须完全自动化才有意义。输出结果需要人工检查的测试不是一个好的单元测试;
  • 单元测试要保证测试粒度足够小。单元测试测试粒度足够小,有助于精确定位问题。单测粒度至多是类级别,一般是方法级别;
  • 单元测试要遵守BCDE原则,Border,边界值测试,包括循环边界、特殊取值、特殊时间点、数据顺序等;Correct,正确的输入,并得到预期的结果;Design,与设计文档相结合,来编写单元测试;Error,强制错误信息输入(如:非法数据、异常流程、非业务允许输入等),并得到预期的结果;
  • 核心业务、核心应用、核心模块的增量代码要确保单元测试通过;

单元测试编码范式

这里主要以Mockito单元测试框架为模版

  1. Mock : 通过when().thenReturn/thenAnswer/thenThrow 或者doReturn().when()等mock方式将依赖类方法进行模拟,模拟服务依赖或者中间结果
  2. DO : 调用被测试类方法,执行测试链路
  3. Verify : 校验执行结果正确性,通过Assert校验数据结果准确,通过Verify校验链路执行准确,通过expected=Exception.class校验异常链路
public class Test {// 0. 依赖类@MockDependencyClass dependencyClass;// 0. 待测试类@InjectMocksTestClass testClass;@Beforepublic void setUp() {MockitoAnnotations.initMocks(this);}@Testpublic void testMethod() {// 1. Mock, 依赖方法,构造中间层数据when(dependencyClass.someMehod(any())).thenReturn(mockData());// 2. Do, 调用被测试类Result result = testClass.testMehod();// 3. Verify, 校验结果数据Assert.assertEquals("some expected result string", result.getModel());}
}

当然写单元测试用例虽然套路比较模版化,但是我们也要充分利用单元测试框架(Junit/Mockito/PowerMock/Spock),掌握其中的一些技巧,才能写出快准狠的单元测试用例,这也是研发同学必须要掌握的基本功。关于如何利用单元测试框架这里不再赘述(详细可以参考阿里技术《Java编程技巧之单元测试用例编写流程》)。

单元测试编码提效

IDEA上有很多单元测试插件,能够半自动化生成单元测试类文件,这里重点推荐TestMe插件。TestMe插件可以智能分析被测试类的依赖类,结合Mockito+Junit等单元测试框架,生成Mock/InjectMocks依赖关系,自动生成单元测试类。

假设业务代码如下:

@Component
public class DefaultMemberManager implements MemberManager {@Autowiredprivate MemberDAO memberDAO;@Autowiredprivate CacheManager cacheManager;@Overridepublic Date queryActivationTime(long userId) {Date activationTime = cacheManager.getActivationTime(userId);if (activationTime == null) {MemberDO memberDO = memberDAO.queryByUserId(userId);if (memberDO != null) {cacheManager.saveActivationTime(userId, memberDO.getActiveTime());activationTime = memberDO.getActiveTime();}}return activationTime;}
}

则通过TestMe快捷键COMMOND+N, 可以极速自动生成如下的单元测试类

public class DefaultMemberManagerTest {@MockMemberDAO memberDAO;@MockCacheManager cacheManager;@InjectMocksDefaultMemberManager defaultMemberManager;@Beforepublic void setUp() {MockitoAnnotations.initMocks(this);}@Testpublic void testQueryActivationTime() throws Exception {when(memberDAO.queryByUserId(anyLong())).thenReturn(null);when(cacheManager.getActivationTime(anyLong())).thenReturn(new GregorianCalendar(2022, Calendar.MARCH, 5, 23, 2).getTime());Date result = defaultMemberManager.queryActivationTime(0L);Assert.assertEquals(new GregorianCalendar(2022, Calendar.MARCH, 5, 23, 2).getTime(), result);}
}

团队单元测试建设

覆盖率概念

覆盖率是类JaCoCo插件通过javaagent挂载的方式,在单元测试命令运行时执行代码覆盖率检测,计算单元测试执行过程中所覆盖的代码比例来生成覆盖率。常见的覆盖率指标,又可进一步细分为语句覆盖率,条件覆盖率,分支覆盖率,路径覆盖率等。这里我们当前更为关注语句覆盖率和分支覆盖率,尤其是增量代码的覆盖率,更能体现变更代码的单元测试覆盖情况。

如何进行单元测试

这里我们借助于阿里研发平台Aone的测试实验室功能,Aone实验室支持测试任务插件的编排组合,通过独立的测试资源执行测试任务。所以我们将代码拉取插件,单元测试插件和覆盖率计算插件进行编排配置,形成最终的执行流:拉取代码;执行单元测试命令;单元测试结果解析;计算覆盖率。最终完成整个工程的单元测试覆盖率计算。

单元测试覆盖率结果示例如下

什么时候触发单元测试

单元测试任务主要通过持续交付流水线pipeline来集成,当前几个主要触发策略如下

  1. 代码提交时,保证单元测试执行及时性
  2. 代码审核时,保证代码审核通过的代码分支符合单元测试标准
  3. 发布流程中,保证最终集成发布的所有分支代码符合单元测试标准

单元测试覆盖率卡点

用户平台技术团队单元测试规范如下:

  • 单元测试用例通过率为100%
  • 单元测试增量代码行覆盖率为85%
  • 代码规范扫描增量问题总数为0个

单元测试覆盖率报表

为了更好的衡量单元测试的覆盖率情况,我们采用报表的形式统计每个应用,每个团队的代码单元测试覆盖率。

总结

当前团队内各应用(除边缘应用外)的单元测试增量代码覆盖率在2022年已经全部达到85%标准,最新平均增量代码行覆盖率达到88%,整体全量代码覆盖率平均提高20%。诚然单元测试覆盖率的提高不是最终的目的,覆盖率高不能完全代表工程质量高,但是一个没有单元测试或者单元测试覆盖率低的工程,其代码质量和稳定性必然不高。同时团队内研发同学对单元测试也有了新的认识,自测和提测质量显著提升,全年未发生由于代码质量产生的线上故障,有效提升了工程质量和服务稳定性。

后续规划,持续优化单元测试质量,提升分支覆盖率,优化边界异常覆盖;关注单元测试编码效率的提升,优化测试用例和测试数据分离;关注核心链路单元测试覆盖率;熟练将TDD思维运用到业务开发过程中。

团队介绍

大淘宝技术-用户平台技术团队是一支集研发、数据、算法一体的团队,负责淘系的用户增长,游戏互动,平台会员和私域运营等消费者核心业务。在对用户争夺进入白热化的时期,团队正承担着捍卫电商主板块增长的重要使命,是阿里核心电商战场的参与者,用持续的技术创新来驱动阿里电商引擎的稳步前行。

原文链接

本文为阿里云原创内容,未经允许不得转载。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云弹性计算对视觉计算的思考与实践

简介:利用人类已有和将有的技术加之商业手段,实现对人类感官体验进行全方位升级。 4月21日,“2022英伟达数字孪生技术应用论坛”上,阿里云弹性计算产品专家张新涛为大家带来了题为《阿里云弹性计算在XR业务上的应用实践》的主题分…

游戏行业弹性计算最佳实践

简介:本篇主要介绍三大游戏场景:游戏服务、大数据运营、云游戏的架构特点,以及基于这些场景下的阿里云游戏行业计算基础设施选型与部署方案。 文丨寻野,阿里云弹性计算产品解决方案架构师 摘要:游戏一直以来是互联网…

三大特性,多个场景,Serverless 应用引擎 SAE 全面升级

简介:Serverless 应用引擎 SAE 凭借着天然技术优势,已经帮助成千上万家企业实现容器和微服务技术转型。近日,SAE不仅进一步提供了全套微服务能力,更为传统 Job 和 PHP 用户提供了全新的,更高效、更经济且可平滑迁移的解…

代码覆盖率在性能优化上的一种可行应用

简介:JavaScript 是前端应用主要语言,相较于其他平台编程语言,JS资源多数情况下要通过网络进行加载,那么代码的体积直接影响了页面加载执行时间。“无效的代码”的多寡直接影响到了我们的代码质量,所以度量代码的执行覆…

MaxCompute湖仓一体介绍

简介:本篇内容分享了MaxCompute湖仓一体介绍。 分享人:孟硕 阿里云 MaxCompute产品专家 视频链接:数据智能实战营-北京站 专题回顾 正文: 本篇内容将通过两个部分来介绍MaxCompute湖仓一体。 一、什么是 MaxCompute 湖仓一体…

云原生离线实时一体化数仓建设与实践

简介:本篇内容分享了云原生离线实时一体化数仓建设与实践。 分享人:刘一鸣 Hologres 产品经理 视频链接:数据智能实战营-北京站 专题回顾 正文: 本篇内容将通过五个部分来介绍云原生离线实时一体化数仓建设与实践。 一、离线实…

议题征集|Flink Forward Asia 2022 正式启动

在这数据量爆炸性增长的时代,开源软件如雨后春笋般出现在开发者的视野中,数据的价值被重新定义。同时,越来越多的企业开启实时化道路,数据的实时分析与计算需求与日俱增。作为主打流处理的计算引擎 Apache Flink 于 2014 年正式开…

龙蜥正式开源 SysOM:百万级实战经验打造,一站式运维管理平台 | 龙蜥技术

简介:SysOM集监控、告警、诊断、修复、安全能力于一体的操作系统运维平台。 文/系统运维 SIG 如果你被突如其来的 OOPS 和满屏奇怪的函数弄得满头问号?机器内存明明很大,却申请不出来内存?业务周期抖动,ping 命令偶尔…

微软在华商业应用战略全面升级,首次推出面向医疗和生命科学的云行业套件

2022年9月29日,微软宣布进一步升级在华商业应用战略,落地一系列智能商业应用(Biz App)功能的同时,以Dynamics 365和Power Platform为基础,进一步完善商业应用战略与价值定位,助力更多客户和合作…

使用Databricks进行零售业需求预测的应用实践

简介:本文从零售业需求预测痛点、商店商品模型预测的实践演示,介绍Databricks如何助力零售商进行需求、库存预测,实现成本把控和营收增长。 作者:李锦桂 阿里云开源大数据平台开发工程师 本文从零售业需求预测痛点、商店商品模型…

龙蜥开源内核追踪利器 Surftrace:协议包解析效率提升 10 倍 | 龙蜥技术

简介:如何将网络报文与内核协议栈清晰关联起来精准追踪到关注的报文行进路径呢? 文/系统运维 SIG Surftrace 是由系统运维 SIG 推出的一个 ftrace 封装器和开发编译平台,让用户既能基于 libbpf 快速构建工程进行开发,也能作为 ft…

开源要正式写进法律了?

作者 | 何苗 出品 | CSDN(ID:CSDNnews)去年,当大家还在为开源的快速发展而欢呼之际,影响了全球数百万台计算机Log4j 漏洞事件给开源软件开发者与使用者敲响了一记警钟。因而今年,开源软件及其供应链安全…

阿里云软著申请|这项保护,让我得到了10万赔偿

简介:对于企业来说,申请软件著作权是证明自己和保护自己的强力护盾。除此之外,它还有着很多不可忽视的意义与价值。阿里云软著申请,一站式智能服务,助力企业和开发者高效发展,省时省力更省心。 前几日&…

宜搭小技巧|海量数据管理难?这招帮你事半功倍

简介:一键生成数据管理页,海量数据随心管理! 话接上回,宜小搭组织大家团建,当收集完大家的报名信息后,有小伙伴想要修改已提交的信息,面对海量的数据,整理查找太费时间。 如何快速…

1024 程序员节官方剧透:重磅大咖再聚,共话中国技术新生态

在二进制垒起的计算机世界里,1024 对于程序员而言,早已不再是单纯的一串数字,不断演进的开发时代赋予了它特殊的意义。 伴随着一份份热衷与期盼,10 月 22-24 日,由湖南湘江新区管委会主办,长沙工业与信息化…

前端性能优化实战

简介:引用彼得德鲁克的一句话,“You cant manage what you cant measure。一件事如果你无法衡量它、你就无法管理它”,性能同样如此。如果没有一个准确的方案来对性能进行度量,那优化就无从谈起。那么对于我们来说,哪些…

Elastic与阿里云助力汽车及出行产业数字化转型

简介:目前,阿里云和Elastic在全国已经有很多的项目正在开展合作,而在移动出行领域与享道出行的合作案例,则是代表性的。 在汽车产业变革逐步深入的当下,云计算、大数据等信息技术成为了汽车企业经历数字化转型时的“刚…

企业版Spark Databricks + 企业版Kafka Confluent 联合高效挖掘数据价值

简介:本文介绍了如何使用阿里云的Confluent Cloud和Databricks构建数据流和LakeHouse,并介绍了如何使用Databricks提供的能力来挖掘数据价值,使用Spark MLlib构建您的机器学习模型。 前提条件 已注册阿里云账号,详情请参见阿里云…

解决微服务架构下流量有损问题的实践和探索

简介:绝⼤多数的软件应⽤⽣产安全事故发⽣在应⽤上下线发布阶段,尽管通过遵守业界约定俗成的可灰度、可观测和可滚回的安全⽣产三板斧,可以最⼤限度的规避发布过程中由于应⽤⾃身代码问题对⽤户造成的影响。但对于⾼并发⼤流量情况下的短时间…

5月25日,阿里云开源 PolarDB-X 将迎来升级发布

简介:2022年5月25日,阿里云开源 PolarDB-X 将升级发布新版本!PolarDB-X 从 2009 年开始服务于阿里巴巴电商核心系统, 2015 年开始对外提供商业化服务,并于 2021 年正式开源。本次发布会将重磅推出在稳定性、生态融合以…