当前位置: 首页 > news >正文

为什么测试这么难写?

tdd的开发实践保证了代码的可测试性,那么当tdd的t变的非常难写的时候是不是现有的代码已然变的可测试性非常的差呢?其中一些非常典型的场景就是

  • test的setup太难,而造成这个的一个主要原因就是贫血的model和万能的service。因为model没有行为,所以很多时候可以通过测试model来完成的测试,却不得不通过测service来完成,而万能的service做的事情又太多,需要依赖的东西也太多,而这个时候你本来一个简单的测试就为了setup这个service的依赖而变成一个巨型的测试。
  • 你总有做behavior verification的冲动,而behavior verification本身就是邪恶的。记得《xUnit test pattens》这本书说到,”任何需要白盒测试的时候,往往都是代码设计的问题“。
  • Assert太多了,一个简单的测试却要有一堆的assert语句。问题很简单,被测试的对象承担了太多了职责。
  • 脆弱的测试,这里我看到了有两个原因:第一,共享的fixture;第二,想当然的assert,比如你只是想assert这个collection有没有你要的那个instance,因为你想当然的认为此时collection里只有一个instance,造成后人对于这个collection加入另一个不同instance依然会break你的测试。

Kent Beck说过,当你的测试出现问题,退后一步往往就是一个设计问题。

项目初期设计framework好吗?

很多人开发人员迷恋framework,迷恋framework设计的优雅以及对于开发的便利。我曾经也是其中一员,但是现在我站在了这个观点的对立面。

首先,项目初期的时候framework的设计在大部分都是猜测,刚开始的时候这些猜测大部分都很准,因为这个时候距离是framework的设计者可以看到了,这就如同你站在原地,你能看到10外的东西,随着项目时间的增长,这个距离也在增长,在加上中间需求的一些变更就如同一个小弯,这时候的位置已经不是framework的设计者所能看到的距离了。这个时候framework对于开发限制开始突出,而开发人员碍于修改framework成本太高,很多时候被framework所牵制。既然我们只能看到10米外的东西,那么我们为什么要做100米外的设计呢?

其次,framework的设计思想也会随着项目人员的进进出出,项目进度的压力,大家都没有实践仔细的去看framework。framwork的设计思想变的不再清晰,大家开始按照自己的对于framework的理解来写代码,后来着更不理解framework,会照那些前面未必正确的理解的代码来书写。

构建环境

一个稳定而快速的构建环境对于团队的开发效率和开发人员的心情影响非常的大。想象一下下面两种情况:

  1. 如果你每次提交代码都让build变红,而你花了几个小时检查之后发现问题出在构建环境上,你是什么心情?
  2. 如果你每次提交代码测试都要跑2个小时,你会选择多久提交一次代码呢?

个人理解的解决方案就是讲build环境也版本管理,理想的情况下新修改build脚本导致构建环境不稳定,可以快速的revert到上一个版本的构建环境。

团队!团队!

一个团队是不仅是在维护一份源代码,更重要的是维护这个项目所承载的知识。而这些知识不应该只记在某些关键人物的脑中,应该记在所有团队成员的脑中,更不应该只记录在文档之中。而这知识包括:

  1. 架构设计的知识:架构设计的知识只有进入所有开发人员的脑中,才能得到正确的实现。因此架构设计不应该只从技术角度考虑,也应该从团队知识传递的角度考虑。一个100的设计,而团队成员只能理解30分,那你觉的最后的软件是多少分呢?
  2. 所谓的局部知识:很多时候,一些开发人员觉得我做的东西只有我一个人在做(比如build脚本),所以我可以选我熟悉的东西就好。而这种所谓局部知识的想法非常不可取,因为当你有这个想法的时候就意味着你变成这个项目的瓶颈。
  3. 固定角色:在团队中固定角色就意味着划定了各个角色的边界,而每个角色对于自己角色外的东西已然不是外面的世界很精彩。这个时候很多时候它做得决定都是基于自己的角色,而不是整个团队的角度
http://www.jsqmd.com/news/1125817/

相关文章:

  • HagiCode 是怎么把 13 个 Agent CLI 接到一套系统里的
  • 成都热门的中央空调企业哪家可靠
  • 告别重复劳动!GIMP BIMP批量图像处理插件完全指南
  • 自动售货机运营需要了解哪些政策法规?新手必看~YH
  • 数据血缘追踪与元数据管理平台
  • NET中的异步编程(四)- IO完成端口以及FileStream.BeginRead
  • 全球邮轮旅行服务市场投资前景分析及发展研究建议报告2026年版
  • Nano Banana 2 怎么用?14 种宽高比 + 4K 出图完整步骤
  • 国漫视效巅峰最好的国产动画片哪吒魔童
  • 四步部署Dify:构建私有化AI应用开发平台
  • 从文档到AI知识库:工程化SOP与RAG实战指南
  • Engine-Sim实战:3大技术挑战与精准仿真验证指南
  • 智商平平”学软件
  • 暖通 / 配电 / 动环培训推荐|传统技工转行机房刚需岗位完整攻略
  • 2025-2026工业纯水机主流品牌资质服务多维对比指南
  • magnetW:一款高效的跨平台磁力链接聚合搜索工具完全指南
  • 从团购网的漏洞看网站安全性问题
  • Git凭据助手原理与安全实践:从本地开发到CI/CD的凭证治理
  • Nginx安全头配置实战:从X-Frame-Options到CSP的完整指南
  • 使用WorkBuddy自动发微博教程
  • 三轴运动跟踪系统设计与IMU传感器应用实践
  • 微信支付V3 微信小程序支付 线下正常、线上验签失败 回调异常 报错 com.wechat.pay.java.core.exception.ValidationException
  • 【2026】3ds Max 2027安装教程超详细图文步骤(附完整安装包)
  • 低压密集型母线槽核心选材标准解析,16 年生产工厂实操经验总结
  • WP7有约(三):课堂重点
  • R语言实现电力系统N-1事故分析与风险图谱生成
  • 创业是一种心态、信念和坚持,是一种生活方式
  • 商品条码查询API实战:免费接口申请到代码集成全攻略
  • UE指的是用户的体验,
  • 如何找到口碑过硬的医美材料供应商?