为什么需要单元测试(5)

简介: 本文剖析单元测试常见反面模式与误区,如“冰激凌筒”“沙漏模式”,揭示重端到端测试、轻单元测试的危害,纠正“用户视角全覆盖即可”“省代码量就是赢”等认知偏差,强调单元测试对代码可维护性与团队协作的关键意义,倡导从进化视角重视单测,提升软件质量与生命力。

反⾯模式和常⻅误区
上⾯提到了写单元测试的种种好处和业界的最佳实践。我们也列举⼀下常⻅的反⾯模式和误区,帮助⼤家更好的规避类似错误。
测试的反⾯模式(anti-pattern)
反⾯模式⼀:冰激凌筒模式
只关注⽤户视⻆的端到端测试、⼤量依赖QA测试都会产⽣如下图所示的反⾯模式。很不幸,这也是在过去的测试体系影响下最常⻅的模式。冰激凌筒模式下,测试套件通常运⾏缓慢、不可靠、难以使⽤。缺失底层的单测也会让项⽬变得⾮常难维护,很难做⼤的改动。
反⾯模式⼆:沙漏模式
沙漏模式下,项⽬中有⼤量的单元测试和端到端测试,但缺乏集成测试。虽然它不像冰激凌筒那么糟糕,但仍会导致许多端到端测试失败,这些失败本可以通过⼀套中等范围的测试更快更容易地捕捉到。当模块间紧密耦合,使得依赖项很难单独实例化出来的时候,就会出现沙漏模式。
测试的常⻅误区
常⻅误区⼀:⽤户第⼀,测试覆盖⽤户的需求⾜够了
这个误区下会认为,端到端测试是站在⽤户视⻆做测试,把⽤户要的功能点都覆盖到就⾜够了。这种误区导致的结果就是冰激凌筒反⾯模式。虽然软件交付的最终功能是给客户使⽤的,但构成软件的代码本身是给⼈(研发)读的、需要⼈去维护。外部⽤户是⼈,内部⽤户也是⼈。
常⻅误区⼆:All-in端到端测试,节省了80%的测试代码量,赢麻了
从短期来看,不写单测可以节省80%的测试代码量和⾄少50%的研发时间。但只要项⽬复杂起来,时间线拉⻓,过去⽋的历史债务(technical debt)早晚要加倍奉还。等到真正需要还债的时候再去补,可能为时已晚。
常⻅误区三:写单测的⼈都弱爆了,我⻓这么⼤还没写出过bug
这篇⽂章可能不适合你。不过软件开发是个团队项⽬,你写的代码最终也会落到别⼈⼿⾥去升级维护,没有测试覆盖的代码是没⼈敢碰的。
总结
结尾处再快速总结⼀下。本⽂从测试体系的历史⼊⼿,讲述了从⼿动测试 -> 靠别⼈⾃动化测试 -> 靠⾃⼰⾃动化测试的历史演化进程,也尝试着从这个视⻆解释为什么⼤家过去不重视单元测试。之后我们分别讲述了什么是单元测试,业界的⾦字塔测试最佳实践,并且深⼊讲解了单元测试的种种好处。最后我们列举了常⻅的反⾯模式和误区,帮助⼤家快速识别规避常⻅的错误。
如果把测试体系的演进类⽐为⼈类的进化,那么我认为⽆单测覆盖和有充分单测覆盖的软件就好⽐爬⾏的古猿和直⽴⾏⾛的现代⼈类。由衷希望⼤家能够重视单元测试、写好单元测试,让我们的软件尽快从爬⾏进化成奔跑,迸发出源源不断的⽣命⼒、创造出更多价值!

相关文章
|
1天前
|
人工智能 NoSQL 前端开发
Chap03. SpringAI
SpringAI整合多款主流大模型,支持对话、函数调用与RAG等架构,提供统一API简化开发。通过ChatClient封装交互,结合Prompt工程、工具调用与知识检索,可快速构建智能客服、哄哄模拟器、ChatPDF等应用,并支持多模态与持久化扩展,助力AI应用高效落地。
|
1天前
|
存储 对象存储
4.4 服务端(Cursor)-接口开发(文件上传)
Sealos开通对象存储服务,首次使用需创建Bucket(存储桶),填写名称后应用。获取Access Key、Secret Key及内外网地址等信息,配置文件上传接口,实现本地文件上传至对象存储,并通过ApiFox测试验证。
|
1天前
|
数据安全/隐私保护
4.5 服务端(Cursor)-接口开发(登录认证)
根据接口文档,完成员工登录功能开发,实现POST请求/login接口,验证用户名密码后返回JWT令牌。登录成功返回用户信息及token,失败返回错误提示。后续请求需在header中携带token进行认证,未登录则返回401。
|
1天前
|
人工智能 前端开发 JavaScript
4.6 前端(Cursor)-页面布局
使用Sealos DevBox创建Vue项目,通过Cursor开发。执行`npm run dev`启动,访问公网地址即可预览。基于Vue3+ElementPlus实现“智学云帆”布局:顶部标题、右侧登录信息、左侧菜单,右侧动态页面。优化背景色、宽度及响应式,首页设计简洁大气,提升整体视觉体验。(238字)
|
1天前
|
前端开发 数据格式
4.7 前端(Cursor)-部门管理
根据部门管理原型图及接口文档,完成增删改查功能开发。前端通过Axios调用后端接口,地址为http://zxyf-management.ns-682s7u7w.svc.cluster.local:8080,需替换为实际内网地址。实现部门列表查询、添加、删除、修改和详情查看功能,注意临时关闭登录校验以确保接口正常访问,后续可优化页面交互与代码结构。
|
1天前
|
前端开发
4.8 前端(Cursor)-员工管理
根据页面原型与接口文档,完成员工管理功能开发,实现增删改查及分页查询。按要求调整新增员工表单布局为六行:用户名姓名、性别手机号、职位薪资、部门日期、头像上传、工作经历(可动态增删)。确保界面与接口对接正常,表单宽度800px,功能完整且符合规范。
|
1天前
|
存储 前端开发 数据安全/隐私保护
4.9 前端(Cursor)-登录
根据登录页面原型和接口文档,完成员工登录功能开发。实现POST请求调用/login接口,处理用户名密码验证,解析JWT令牌并存储,后续请求通过header携带token。登录失败提示错误信息,成功后跳转至系统首页;若检测到401未授权状态,自动跳转回登录页。
|
1天前
|
前端开发 Java
5.项目上线
本文介绍项目前后端发版上线全流程:编写entrypoint.sh启动脚本,通过devbox打包发布。后端构建成功后配置参数部署,前端更新接口地址并重新打包,最后分别发版上线,验证公网访问。完整实现应用部署。
|
1天前
|
运维 NoSQL 测试技术
Redis:内存陡增100%深度复盘
一次Redis崩溃事故复盘:大KEY导致带宽占满,内存被缓冲区耗尽,虽有淘汰策略但无法挽救。根本原因非数据膨胀,而是输出/输入缓冲区激增,挤占内存,叠加主线程阻塞,最终引发雪崩。需警惕缓冲区风险,规范使用Redis。
|
1天前
|
消息中间件 监控 Java
RocketMQ:底层Netty频繁OS OOM
本文记录了一例Java应用因多ClassLoader加载多个Netty的PooledByteBufAllocator导致堆外内存超限,引发OS OOM的问题排查过程。通过NMT、Arthas等工具分析,发现7个不同类加载器各自实例化独立的Allocator,均不受MaxDirectMemorySize全局限制,最终累计占用近1.5G堆外内存。虽调整JVM参数难根治,短期建议缩堆让出内存,长期需中间件协同优化。