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

简介: 长期以来,软件测试依赖人工,繁琐易错。虽演进为自动化测试,但研发与测试分离导致重功能轻质量。谷歌、微软推动“研发即测试”趋势,强调单元测试先行。测试金字塔主张80%单元测试夯实基础,提升代码质量与研发效率,实现可持续交付。

过去的很⻓⼀段时间⾥,软件测试⼤量依赖⼈⼯检测。软件测试甚⾄是⼀个独⽴的⼯种(QA、Tester),QA/tester的⽇常任务就是进⾏⼤量的⼿⼯测试、繁琐易错。
⾃2000年代初以来,软件⾏业的测试⽅法已经发⽣了巨⼤的变化。为了应对现代软件系统的规模和复杂性,业界演变出了开发⼈员驱动的⾃动化测试实践。我们终于可以摆脱⼿动测试的繁琐,⽤软件来测试软件。但过去的实践仍然留下了深远的影响,软件测试还是⼀个独⽴的⼯种,过去的QA演进成了SDET(Software Developer Engineer in Test),我们虽然进化到会使⽤⼯具了,但我们还只是会⽤⼯具的猴⼦。为什么这么讲?因为这种研发/测试分离的模式本身就留下了很多问题。当研发和测试是两个岗位时,交付的边界是软件整体的功能性(functional requirements)和可⽤性。研发只要保证软件整体上功能完备、可⽤就⾏,测试也会聚焦在集成测试和端到端测试上。但软件是由⽆数个最⼩单位构成的,在这种体系下⼈们会忽视最⼩单位的质量、是否可读可测可演进,最终难免“⾦⽟其外,败絮其中”。
基于种种弊端,⾕歌、微软这些对研发质量⾮常重视的公司都在从SDET的2.0时代过渡到 all-in-one 的3.0时代:微软在2015年去掉SDET⼯种,在陆奇带领的Bing中率先提出“combined engineering” 的概念;⾕歌也将SETI替换成EngProd(Engineering Productivity),专⻔负责测试平台和⼯具的搭建,不负责具体的业务逻辑测试。
为什么需要单元测试
在如今的互联⽹时代,软件迭代的速度越来越快,研发的职责也越来越多。DevOps的理念是"you build it, you run it",研发/测试合⼆为⼀的趋势也可以理解为对"you build it, you test it"的呼吁。当研发要对⾃⼰写的代码质量和测试负责的时候,好的测试实践就必不可少了。
测试⾦字塔
就像盖楼需要从打地基、竖钢筋、灌⽔泥层层往上构建⼀样,测试也有类似的测试⾦字塔架构。下图出⾃《Software Engineering at Google》的测试章节,总结了Google在测试⽅⾯的最佳实践。我们可以看到测试⾦字塔由三层构成,最底层就是单元测试、占⽐80%,是软件系统的地基。再往上是集成测试和端到端测试,分别占15%和5%。因为从下往上占⽐逐层缩减,因此被称为测试⾦字塔(跟盖⾼楼⼀样)。⾕歌推荐的这个⽐例是多年实践出来的结果,意在提升研发的效率(productivity)并提升对产品的信⼼(product confidence)。
测试⾦字塔的核⼼理念之⼀就是“Unit Test First“,每个软件项⽬⾥的第⼀⾏测试应该是单测(TDD甚⾄认为第⼀⾏代码就应该是单测),⽽且⼀个项⽬⾥占⽐最⾼的测试也应该是单测。

相关文章
|
1天前
|
敏捷开发 Dubbo Java
需求开发人日评估
本文介绍敏捷开发中工时评估的关键——人日估算方法,涵盖开发、自测、联调、测试及发布各阶段周期参考,并提供常见需求如增删改查、导入导出、跨服务调用等的典型人日标准,助力团队科学规划迭代。
|
1天前
|
负载均衡 算法 应用服务中间件
负载均衡1
当流量高峰来临,低配节点因负载过高导致服务可用率下降。传统通过治理平台手动调权重的方式滞后,影响业务。本文探讨RPC框架如何实现智能负载均衡,自动根据节点负载动态分配流量,提升系统稳定性与响应效率,避免人工干预不及时的问题。
|
1天前
|
敏捷开发 Java 测试技术
为什么要单元测试
单元测试看似“踩刹车”,实则让开发跑得更快。本文从测试演进史出发,解析为何谷歌、微软推崇“单元测试先行”。通过测试金字塔、反模式案例,揭示单测在提效、降错、促重构中的核心价值,助力软件从“爬行”进化到“奔跑”。
|
1天前
|
关系型数据库 MySQL Shell
Docker网络3
Docker网络模式包括:none(禁用网络)、container(共享指定容器网络)和自定义网络。推荐使用自定义桥接网络实现容器间通信,支持通过服务名互连,避免IP硬编码。--link已过时,不建议使用。
|
1天前
|
监控 数据可视化 Shell
Portainer轻量级图形化监控
Portainer是一款轻量级Docker可视化管理工具,支持单机与集群环境,提供图形化界面。分为开源CE版和商用版。通过Docker运行,映射端口并挂载socket文件后,浏览器访问9000端口即可管理容器、镜像、网络、卷及Compose编排,操作便捷,适合初学者与团队使用。(238字)
|
1天前
|
NoSQL 关系型数据库 MySQL
Docker-compose容器编排2
本文介绍了Docker Compose常用命令及典型编排示例,涵盖服务的创建、启动、停止、日志查看等操作,并通过YAML文件实现多容器应用(如SpringBoot、Redis、MySQL)的统一编排与管理,提升容器化部署效率。
|
1天前
|
前端开发 安全 Java
Day04-代码模块改造
本课学习Swagger接口文档集成与Velocity模板引擎应用,解决前后端联调难题。通过Knife4j优化API展示,利用Lombok简化实体类,并改造若依代码生成器支持MyBatisPlus、Swagger注解及LocalDateTime类型,提升开发效率与代码优雅性。(239字)
|
1天前
|
XML Java Linux
Linux
本文介绍如何打包并部署一个SpringBoot应用到Linux环境。包含项目搭建、pom.xml配置、健康检查接口实现,以及JDK安装、环境变量配置、应用上传与启动全流程,最终通过心跳接口验证服务正常运行。
|
1天前
|
应用服务中间件 Linux Docker
Docker网络2
Docker默认创建docker0网桥,实现容器与主机间的网络互通。容器通过veth pair与docker0连接,共享物理网络。bridge模式下自动分配IP,host模式则共用宿主机网络,无需NAT,但-p映射无效。查看网络信息可用`docker network inspect bridge`。
|
1天前
|
Shell Linux 虚拟化
Docker网络1
Docker网络通过虚拟网卡实现容器间通信与隔离。启动后生成docker0网卡,支持bridge、host、none三种默认网络模式,可使用network命令管理网络:ls查看、add添加、rm删除、inspect查看详情、prune清理无效网络,容器可通过服务名直接通信,IP变化不受影响。