张大胖和单元测试

Cisco702胖AP固件 立即下载

1

敏捷运动

张大胖的公司正在掀起一场轰轰烈烈的敏捷运动。

似乎一夜之间, 每个人的嘴边都挂起了scrum, xp , tdd,user story 等敏捷词汇。

公司要求, 每个开发人员都必须掌握单元测试这个非常基本的敏捷实践,为此公司还专门组织了单元测试培训。

张大胖自然不能落后, 他热情满满地参与了培训,  在会议上了解了单元测试的各种好处, 学会了JUnit这个简单又强大的测试工具,理解了一个测试用例执行之前会调用"Setup"方法做必要的初始化, 执行完毕以后会调用 “teardown”做清理。

培训中还特别提到了如何做Mock对象, 这让张大胖印象深刻: 原来那些不存在的或者难于new 出来的对象可以使用Mock工具(EasyMock, jmockit等) 来“造假”啊!

公司还专门定义了什么是好的单元测试:

1.  单元测试是“白盒测试”, 应该覆盖各个分支流程、异常条件

2.  单元测试面向的是一个单元("Unit"), 是java中的一个类或者几个类组成的单元。

3.  单元测试运行一定要快!

4.  单元测试一定是可重复执行的

5.  单元测试之间不能有相互依赖,应该是独立的。

6.  单元测试代码和业务代码同等重要, 要一并维护。

培训结束了,张大胖信心满满: 写单元测试简直就是小菜一碟!

精明的项目经理趁热打铁、不失时机对大家提出了要求:  兄弟们,我听说隔壁组定了一个目标, 单元测试的代码覆盖率要达到70% , 我们一定要超过他们, 我们的覆盖率要达到 75% !

2

困惑

张大胖磨拳擦掌,准备大干一场 , 他打开了Eclipse,  开始查看自己之前写的代码,准备全部加上单元测试用例, 搞一个代码100%全覆盖, 勇夺覆盖率冠军!

可是第一个小模块就把张大胖给难住了, 你看看这代码, action调用service, service调用 dao, dao里都是sql,  简单的增删改查,这有什么可测试的?

唉,为了代码覆盖率,硬着头皮写吧,按照分层测试的原则, 测试action的时候把service给mock出来,测试service的时候把dao给mock出来......但张大胖总觉得不太对劲,总是觉得自己是在测试框架,而不是测试业务代码。

当然,张大胖也遇到了一些有一定业务逻辑的模块,但是这些模块患有重度依赖症,依赖10几个其他模块的接口,为了单独测试他们,张大胖废了九牛二虎之力,做了10多个mock对象才把依赖给解除开。

但是mock对象过多, 协调他们进入一致的状态来正确执行测试十分困难: 当接口1处于A状态,并且接口2处于B状态, 并且接口3处于C状态.....  接口10处于X状态时, 测试用来才能正确执行, 唉,真是不容易啊。


一天下来, 这个mock就把张大胖弄的头晕。

大胖感慨的想: 敏捷教练们大谈单元测试的好处, 可用来展示的都是非常简单的例子, 现实的代码要复杂的多啊。

第二天便发生了状况, 同组的小李改了业务代码,却忘记修改单元测试代码,导致很多单元测试失败,那一大片醒目的红色让人触目惊心。

小李去修改单元测试,可是怎么都读不懂大胖的测试用例,他不满的说:  ”大胖,我觉得你的测试代码比业务代码都要复杂啊, 你是怎么写出来的?“

大胖委屈的说: “别说你了, 看看这么多的mock 对象, 我自己都头晕, 这该怎么办呢?”

小李也没辙,  这样下去, 别说业务代码了, 光是维护单元测试就把人给累死了。

3

讨论

他们俩人去找项目经理诉苦, 经理说:  有不少人都在说这个问题,我们开一个会议来讨论下吧!

项目经理召集了几个经验丰富的骨干专门来讨论这个问题。 他先做了一个开场白:

“我们现在的单元测试进行的如火如荼, 我们组做的还是非常好的, 其他组遇到的像”单元测试运行慢”, “单元测试不能重复执行, 换一台机器就出错”,"单元测试互相依赖" 等常见问题我们组基本没有,   我们遇到的主要问题有两个:

1. 张大胖和小李反映单元测试代码过于复杂, 难于维护, 张大胖那个mock了10多个接口的测试想必你们也看到了

2. 大家认为有些非常简单的增删该查没必要去做单元测试 。

如果单元测试维护成本越来越高, 我担心大家会慢慢的抛弃他们, 大家一块儿来想想办法吧”

老梁说: “我做单元测试的时间比较久了, 我认为如果测试代码需要很复杂的Setup 才能开始测试, 那就反映了一个问题:我们的业务代码接口设计有问题!  ”

张大胖佩服的说: “老梁真厉害,一下子就看出了问题的本质, 我当时只是想着怎么把测试搞定,没想到是业务代码的问题”

老蔡也附和说: “说的没错, 简单的单元测试谁不会啊?  关键还是要处理现实中的遗留代码, 我们之前有些模块的API设计确实是有问题, 看来到了重构的时候, 我们趁着这次东风把一些不好的设计提升一下, 这样测试肯定会变的简单。 大胖, 小李, 重构的过程基本上就是一个重新设计的过程, 这可是个学习的好机会啊”

大胖说:“ 我也了解过一些重构, 正好练习一下。 ”

大家都表示同意, 只是项目经理为难的说: “重构可能会很费时间, 还有可以引入新的bug , 测试也要介入, 这样的话会不会影响我们的进度啊?”

老梁说: “这也是没办法的事情 ,如果不重构, 不要说单元测试了, 就连我们的代码都可能今天被贴个补丁, 明天再被贴个补丁, 慢慢的腐化下去, 越来越难以维护, 最后无人能懂, 无人敢改,维护成本可是天价了。 ”

大胖说: “没事, 为了学习 ,我愿意加班来做”

经理赞赏的看着大胖,心说:  "这孩子不错,挺上进的, 年终考核的时候得倾斜一下"

“好吧,就这么决定” 经理说,“大胖,相关的重构你来做, 有问题的话请教老梁和老蔡吧”

“那增删该查到底要不要测试?”

老梁说:“我那天仔细思考了一下,这些代码没有逻辑, 就是一层调用一层, 我觉得单元测试必要性不大”

“如果不测试,怎么保证正确性呢? 我们的代码覆盖率也肯定达不到75%了” 大胖说

“没有必要特别追求代码覆盖率, 要不这样” 老蔡说,“对于这样的代码, 咱们就不要写单元测试了, 还是通过自动化的功能测试来覆盖得了!”

“嗯,我觉得这样可行, 功能测试可以有开发写, 也可以由测试来写” 项目经理说

老梁说: “同意, 还有一点建议是, 之前我们都是程序员在自己机器上跑单元测试, 以后咱们要把运行的过程加入到自动化的Build当中, 包括单元测试和功能测试,作为重要的质量保证。”

4

一年以后

经过团队艰苦的努力, 张大胖的项目组通过单元测试和功能测试编织起来了一张密密麻麻的安全大网,不管是多么微小的变动, 都有测试用例做回归测试, 现在大家需要改动起代码时比原来自信多了。

更重要的是, 关键的核心代码做了重构,接口API变的越来越好,代码易读易维护,没有了脏代码的羁绊, 新需求实现起来也更加容易。

张大胖感慨的说: “实现了自动化的单元测试, 我们确实变得更敏捷了。”

当别人问他是怎么做单元测试的, 张大胖说: “告诉你吧, 关键就在于如何处理遗留代码。”

后记: 我在文章中描绘了一个实现自动化单元测试的理想项目组, 但实际情况下, 很多公司都是浅尝辄止,没有精力和时间去完成代码的重构, 单元测试变成了一个鸡肋, 最后还是被废弃掉,回到老路子上去了。

你看到的只是冰山一角, 更多精彩文章,参见《码农翻身2016文章精华》

有心得想和大家分享? 欢迎投稿 ! 我的联系方式:微信:liuxinlehan  QQ: 3340792577

0?wx_fmt=jpeg

公众号:码农翻身

“码农翻身”公众号由工作15年的前IBM架构师创建,分享编程和职场的经验教训。

单元测试假成功和假失败的避免方法 单元测试假成功和假失败的避免方法单元测试工具1基本信息摘要:描述了单元测试要避免的几个问题,并给出几个最佳实践建议。2假成功的单元测试1.问题描述:在testXXX方法中,看到有这样的测试代码:publicvoidtestInvoke(){try{…assertEquals  单元测试假成功和假失败的避免方法  单元测试工具  1基本信息  摘要:描述了单元测试要避免的几个问题,并给出几个最佳实践建议。  2假成功的单元测试  1.问题描述:  在testXXX方法中,看到有这样的测试代码:  publicvoidtestInvoke(){  try{  …  assertEquals(a,b 立即下载

相关推荐

Windows——Nessus安装(无限制)

Nessus手把手图文安装,解除ip限制~

网安小白的博客 9451

张大胖的需求估算

周五傍晚, 快要下班了,想着马上就要到来的周末, 张大胖的心情是无比愉悦。晚上和女朋友去看场电影,听说星爷的新片很不错, 她已经叨叨好几天了。周末再出去吃顿大餐,最近项...

码农翻身 449

Multisim仿真运放积分器踩坑实录:为什么你的方波变不成三角波?

本文针对Multisim仿真运放积分器时方波无法转换为三角波的常见问题,提供了详细的排查与调试指南。文章指出,经典RC积分电路因直流反馈开路导致运放饱和,核心解决方案是在反馈电容两端并联大阻值电阻以稳定直流工作点。通过参数优化(调整Rin、C、Rf)和高级仿真技巧,手把手教你调出线性度好、幅度适中的完美三角波,并分享异常波形(如饱和、不对称、振荡)的对应策略。

weixin_29231263的博客 115

单元测试体系(四)-service单元测试例子

单元测试体系(三)-service单元测试例子

杨杨杨~~的博客 1605

自动驾驶仿真工具链集成:ECU TEST与VTD、VERISTAND的深度配置指南

本文详细介绍了自动驾驶仿真测试中ECU TEST、VTD与VERISTAND三大核心工具的深度集成与连接配置方法。通过解析工具链的角色分工,提供从单机到分布式部署的实战指南,并重点阐述了Test Bench Configuration与Test Configuration的关键参数设置、SSH免密登录配置,以及在线与离线工作模式的切换技巧,旨在帮助测试工程师高效构建稳定、自动化的硬件在环测试环境。

wind6的博客 791

Tesseral 建立地震模型

0. 前言 本节内容主要是总结如何使用 Tesseral 工具建立模型。 1. 模型建立步骤 设置模型的宽度和深度 此处默认都为1000,之后点击“确定” 建立地层 绘制新的地层 右键点击“New polygon” 绘制地层,设置第二个层的名字和纵波速度 绘制第三层,第三层覆盖在前一个层上 第四层如上,第四层如果是最后一层,绘制该层时,要将深度1000包围。 设置观测系统 设置炮点 设置子波为雷克子波,频率设置为30 检波点设置 运行模型 设置好如上选择后,

weixin_41857483的博客 6541

为啥需要单元测试

单元测试即对程序模块进行正确性检验的测试工作。 单元测试是程序员基本的技能之一,很多刚入门的程序员对单元测试存在以下误解: 单元测试不是测试人员的事情么? 自己为什么要测试自己的代码? 单元测试的成本这么高对于产品开发有意义么? 我这么牛我不需要单元测试! 好,现在来为啥非要单元测试呢?有什么具体的好处呢? 首长需要澄清的一点,编写单元测试不但不会浪费你的时间,反而很大程度上能避免你因为突发 ...

weixin_42936560的博客 530

AI 代码赋能短视频带货:服装及多赛道批量内容生产全流程实操

本文聚焦 AI 技术在短视频带货领域的落地应用,以服装赛道为核心,延伸至花卉绿植、图书、茶具等热门领域,系统拆解 AI 工具在选品、素材处理、视频制作(含动态效果、场景搭建)、运营优化等环节的实操方法。针对从业者普遍面临的 “内容生产低效”“无专业技术难出优质视频”“流量运营踩坑” 等痛点,提供从基础工具使用到高阶视频制作的全流程技术方案,助力相关从业者借助 AI 实现批量、高效的短视频内容产出。

m0_67958922的博客 3085

漫画 | 单元测试实在是太可怕了!

周一刚上班,会议室就传来了经理老梁的咆哮。张大胖和何小痩赶紧分析原因许久都没人敢发言。老梁打开了电脑,决定给程序员上一课。新版本的开发又开始了。张大胖无奈,只好加班写单元测试用例过了两天,...

码农翻身 3813

【数学基础】基于欧拉角表达的旋转顺序

欧拉角旋转顺序

FalschxMico 1385

决策规划算法四:Piecewise Jerk Path Optimizer

一,问题分析 路径规划的本质目的:规划出一条安全(无碰撞),舒适(平滑),符合车辆运动学的轨迹。 如下图所示,决策算法开辟凸空间后,路径规划算法用数值优化的方法搜索出一条最优路径,即将问题转化为二次规划的问题,采用二次规划的求解器进行求解。 二次规划问题的求解顺序: 1,确定优化变量 2,确定目标函数 3,确定约束条件 4,将目标函数和约束条件变形为二次规划的标准形式 5,用二次规划求解器进行求解,获得优化变量的序列,使得目标函数取得最小值。 注:路径的最终表达式为:,..

肥嘟嘟的左卫门 8562

构建知识体系 第1期 - 单元测试

关注“前端张大胖”打破知识诅咒和我一起打造自己的知识体系从此告别迷茫━━━━你项目开发的过程中用到单页测试了吗?不只是做前端,使用任何一门语言进行项目开发都需要单元测试...

zz_jesse的博客 198

飞牛fnNAS搭建web版微信

摘要:本文介绍了一种通过Docker在飞牛NAS上部署微信客户端的方法,实现24小时同步微信聊天记录。具体步骤包括:1)激活飞牛NAS的Docker功能并配置镜像加速源;2)创建专用文件夹并下载docker-wechat镜像;3)设置容器参数并部署微信客户端;4)通过局域网或ZeroTier内网穿透实现远程访问。相比传统Windows/Linux方案,该方法资源占用更低,适合需要长期保存微信聊天记录的用户。

dgnankai的专栏 3343

什么TDD,让它见鬼去吧!,从入门到精通的Android进阶学习笔记整理

我见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。不断奔跑,你就知道学习的意义所在!

m0_57541068的博客 727

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

构建知识体系 第3期 - 单元测试之React怎样测试

关注“前端张大胖”打破知识诅咒和我一起打造自己的知识体系从此告别迷茫━━━━咱们从上一篇文章了解到可使用 mocha 和 node 内自带的断言库assert做 nod...

zz_jesse的博客 242

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

构建知识体系 第2期 - 单元测试如何做 http 测试

关注“前端张大胖”打破知识诅咒和我一起打造自己的知识体系从此告别迷茫━━━━上一篇文章我们大概的了解了单元测试的理论知识以及如何配置和使用,以及针对模块、control...

zz_jesse的博客 255

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Code Review 的巅峰

Code Review张大胖工作快一年了,这一年看了不少书,尤其是编程实践方面,例如单元测试、重构、持续集成等等, 和公司的开发现状一对比, 就发现很多软件开发实践不够规...

码农翻身 446

艺术编程-技术之声第9期

艺术编程-技术之声第9期技术未来:1.摩拜CEO:失败了,就当做公益吧 2.关爱脸盲,人人有责 3.如何买到一辆适合车震的二手车?技术之声: 1.ASM: 一个低调成功者的自述 2. 聊聊Java 平台上的非Java语言 3. 如何实现超高并发的无锁缓存? 4. 【死磕Java并发】—–Java内存模型之分析volatile 5. 理解本真的REST架构风格本周推荐-与君共勉: 1

IT小生 505

码农翻身精华文章

大话编程 我是一个线程 我是一个Java class Javascript: 一个屌丝的逆袭 Java:一个帝国的诞生 JSP:一个装配工的没落 TCP/IP 之 大明王朝的邮差 TCP/IP 之 大明内阁 TCP/IP 之 蓟辽督师 CPU 阿甘 CPU 阿甘之烦恼 CPU 阿甘:函数调用的秘密 我是一个网卡 我是一个路由器 我是一个进程 我是一块硬盘(上) 我是...

hello world! 478

码农翻身部分章节连接,小说式编程,java,数据库。。。

大话编程 我是一个java class 张大胖学数据库 TCP/IP 之 大明王朝的邮差 TCP/IP 之 大明内阁 TCP/IP 之 蓟辽督师 CPU 阿甘 CPU 阿甘之烦恼 CPU 阿甘:函数调用的秘密 张大胖的socket 张大胖学递归 学习面向对象的令狐冲 数据库村的旺财和小强 小李的数据库之旅(上) 小李的数据库之旅(下) 漫画:什么是机器学习 那些烦人的同步和互斥问题 IE为什么把Chrome和火狐打伤了 对浏览器村的第二次采访 节约标兵IE的自述 EMail 诞生记(上) EMail 诞生记

zzz的博客 211

什么TDD,让它见鬼去吧!

光有这些思路和搞懂单个知识的应用是还远远不够的,在Android开源框架设计思想中的知识点还是比较多的,想要搞懂还得学会整理和规划:我们常见的**Android热修复框架、插件化框架、组件化框架、图片加载框架、网络访问框架、RxJava响应式编程框架、IOC依赖注入框架、最近架构组件Jetpack等等Android第三方开源框架,**这些都是属于Android开源框架设计思想的。如下图所示:这位阿里P8大佬针对以上知识点,熬夜整理出了一本长达1042页的完整版如何解读开源框架设计思想。

2401_84279169的博客 336

放心吧,敏捷开发搞不起来!

1敏捷转型周一上班,张大胖收到经理的一封邮件,标题赫然写着:大胆拥抱变化,努力促进敏捷转型。旁边的何小痩吐槽说:我们的瀑布模型用得挺好啊,职责明确,按部就班,为啥要转型?折腾人!喜欢接触新技术的张大胖说:放心吧,敏捷软件开发那一套,Scrum、 TDD、结对编程我早就试验过,我给你说,根本就用不起来。张大胖的公司之前一直使用瀑布模型进行开发:软件开发就像接力赛,一棒接一棒...

码农翻身 1148

告别2017,码农翻身全年文章精华

时间过得真快,转眼间2017年就结束了!感谢大家一年来的陪伴、支持和鼓励!这里是2017年全年码农翻身文章精华, 点击标题阅读, 欢迎转发分享。 如果觉得不过瘾的话,一定要逛逛《码农翻身2016年文章精华》, 那里有更多有趣的技术故事。大话编程一个故事讲完httpsC老头和Java小子的硬盘夜话我是一个函数操作系统是个大骗子?90后“老头儿”和00后Go小子的硬盘夜话爱炫耀的数据库老头儿浏览器:一...

Robin022的专栏 396

2017上半年的精华文章全在这里了

这里是2017年上半年码农翻身文章精华, 点击标题阅读, 欢迎转发分享。如果觉得不过瘾的话,一定要逛逛《码农翻身2016年文章精华》, 那里有更多有趣的技术故事。大话编...

码农翻身 303
上一篇: 漫画:编程是文科还是理科?
下一篇: ASM: 一个低调成功者的自述
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值