by JOKER on 2013/05/05

最近状态不是很好,负能量堆到积爆表,静下心来看书写点东西才是出路。给瞎折腾的这两年,做个总结吧。

一些practice和总结

充分单元测试能帮助项目快速推进。看起来单元测试会增加开发时间,但事实上大多数时候它不但会缩短当前功能开发到release的时间,还能为后续的功能的开发做铺垫。

单元测试覆盖率必须保证绝大部分业务逻辑被覆盖。实践起来就是,除了一些异常分支,覆盖所有可以覆盖的代码。这样单元测试才能起到哨兵的作用,在写新逻辑和重构代码的时候,保证一旦旧代码的正确性被破坏,单元测试马上fail预警。如果单元测试的覆盖率不够,是无法被依赖的。单元测试的作用得在覆盖率达到一个比较高的值的时候才能完全展现。

单元测试有助于提高代码质量。由于需要考虑代码的可测试性,有利于促成依赖注入(DI)、控制反转的设计。控制代码之间的耦合程度。站在开发者的角度来说,test case有助于提高开发者的编码和设计能力。一点经验是慎用单件(Singleton)。单件其实就是OO世界的全局变量,所有使用单件的代码都会和它强耦合,在测试的时候难以隔离。项目中遇到很多复杂繁重的单件,需要大量时间初始化,严重拖累了test case的执行效率。

用循序渐进的方法处理遗留代码,小规模重构,低痛低风险;持续重构,零修碎补。我刚进入项目的时候,项目有大概两万行的遗留代码,里面有比较多晦涩的业务逻辑,代码风格和结构都有一些问题,测试覆盖率不到30%。没时间完全重写,只能循序渐进,每开发一个新功能,重构一个老模块并补充test case,大概用了半年重构了大部分代码、补充test case。并且每次新feature开发都会分出一部分时间对之前的代码进行重构。

童子军军规:走的时候要比来的时候干净。破窗效应:一扇窗户被打破不修理,很快会有越来越多的窗户被打破(Bob大叔《Clean Code》)。这两条的想达到的效果是促进良性循环、避免恶性循环。我具体的实践是:

  • 保证每次代码提交test case覆盖率只能提高不能降低
  • Fix原有代码中所有的编译warning、findbugs、checkstyle warning,并保证commit新代码不引入新的warning

通过坚持这两个原则,半年后项目代码质量有明显提高,test case覆盖率从30%提升到85%,sonar的Rules compliance从80%提升到95%,代码重复率从10%降低到0%。而代码质量的提升对开发效率的帮助也是明显的,bug定位、添加新feature变得容易,功能测试发现的bug数和消耗的时间都有减少。

重视工具:流程固化在工具中,自动化所有重复工作。公司层面的实践是:有一个专门的team负责内部工具,并且这个team里都是最优秀的人;对于小型创业公司就是买适合自己的工具。流程是痛苦的,好的工具可以消灭或者减轻这些痛苦。目前的项目在这方面做的很不好,流程的实施,依赖人的职业性对抗人性的弱点,带来的后果是时间的浪费、人的疲惫以及生产效率降低。

尽量创造两人协作的环境。一个人孤独的做事对人对事的要求都太高(人要长时间自我驱动,事要靠谱),而三个人协作很难达到三倍的效率(沟通成本指数上升),但是两人协作却可以达到两倍的效率。两人协作可以既保证概念完整性又保证效率,父母抚养小孩是典型的例子(《设计原本》中文版P56 第六章 阐述了这个观点)。在复杂的项目里,很难把人数控制在两人,但也可以创造局部的两人合作。Two is the magic number

测试金字塔

测试金字塔

测试方面一个重要的总结是测试金字塔,其想表达的是:bug发现的越早,处理的成本越低。由此引出一个原则:尽量早地发现bug,尽量在开发过程中发现bug,而不是过度依赖QA,单元测试和持续集成是重要手段。下面的表格说明了bug发现阶段所增加的成本。

发现BUG的阶段 相比在前一阶段修复BUG的额外成本
Coding 直接改代码
开发期间部署测试 Debug,重新ci代码,重新部署
QA 和QA沟通,完成bug提交、确认、fix、回测的流程
上线后 处理用户反馈,重新走上线流程

用到的工具

    • 单元测试框架JUnit/TestNG

一两年前JUnit和TestNG相比简直是弱爆了,现在JUnit也逐步赶了上来,补充了一些不错的feature,比如timeout、exception、Parameterized Test等实用功能,详见JUnit wiki

    • Spring Testing

Spring TestContext Framework,实现测试组件的依赖注入,避免繁琐的setUp过程。 官方文档

    • mock框架mockito、PowerMock

mockito比JMock和easyMock有更优雅的语法 项目主页
用PowerMock测试static方法和final类 项目主页
用反射测试private方法(spring的ReflectionTestUtils)

    • lombok

编译期代码生成工具(JDK1.6+),自动生成getter/setter、toString、equals、hashCode、构造函数,checked exception转runtime exception,自动close资源等各种magic,项目主页

    • JRebel

基于java agent的热部署工具,实现代码的热替换,避免重启web容器。大幅提高开发效率(尤其是对启动过程比较漫长的应用来说),支持大多数java ee容器。结合Ant的sshexec task可以实现一键从开发机更新代码到测试机,并且立即生效。项目主页

    • 持续集成工具jenkins

Jenkins结合Ant、覆盖率测试工具cobertura、java代码静态检查工具checkstyle、findbugs、sonar,完成每次提交自动构建、运行test case、计算test case覆盖率、检查代码bug的功能,极大的方便了对代码质量的监控(感谢测试开发同事的工作)。

    • teambox.com

项目协作的工具,一个SaaS,速度还凑合,对于小团队来说不错,基本功能是task管理,另外还有会话、文件共享、笔记等功能,5个人以下免费用,就是速度略慢。

This is not the end, this is not the beginning.

感谢Barton和Calphy。

THIS ENTRY WAS POSTED IN 技术学习. BOOKMARK THE PERMALINK.

一些practice和总结(转载)的更多相关文章

  1. 转载https://www.luogu.org/problemnew/solution/P1665,http://bailian.openjudge.cn/practice/2002/的新解法

    不知道为什么O(n^4)O(n4)的玄学方法能过,正解显然是O(n^2)O(n2)的,枚举对角线,然后算出另外两点判断存不存在. 关键就在怎么通过对角线算出另外两点的坐标. 先贴公式. int mid ...

  2. Atitit 数据存储视图的最佳实际best practice attilax总结

    Atitit 数据存储视图的最佳实际best practice attilax总结 1.1. 视图优点:可读性的提升1 1.2. 结论  本着可读性优先于性能的原则,面向人类编程优先于面向机器编程,应 ...

  3. 【转载】Recommendations with Thompson Sampling (Part II)

    [原文链接:http://engineering.richrelevance.com/recommendations-thompson-sampling/.] [本文链接:http://www.cnb ...

  4. 【转载】Bandits for Recommendation Systems (Part I)

    [原文链接:http://engineering.richrelevance.com/bandits-recommendation-systems/.] [本文链接:http://www.cnblog ...

  5. [转载] TLS协议分析 与 现代加密通信协议设计

    https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/?from=time ...

  6. [转载] what's goole mock

    原文: https://code.google.com/p/googlemock/wiki/V1_7_ForDummies 地址被墙了, 看起来费劲, 转载一份 Google C++ Mocking ...

  7. (转载)iOS Framework: Introducing MKNetworkKit

    This article is available in Serbo-Croatian,  Japanese and German. (Translations in Serbo-Croatian b ...

  8. (转载)XML Tutorial for iOS: How To Choose The Best XML Parser for Your iPhone Project

    There are a lot of options when it comes to parsing XML on the iPhone. The iPhone SDK comes with two ...

  9. [转载] 常用 Java 静态代码分析工具的分析与比较

    转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代 ...

随机推荐

  1. android 后台代码设置动画

    1.设置旋转动画 final RotateAnimation animation =new RotateAnimation(0f,360f,Animation.RELATIVE_TO_SELF, 0. ...

  2. printf的一个常用技巧

    acm 的题目经常要求输出最后面一位不能有空格: 用if语句显得代码难看: 实现如下: int a[5]={1,2,3,4,5}; for(int i=0;i<=4;i++) printf(&q ...

  3. 转载:百度原CTO李一男经典语录

    原文地址:http://www.cnblogs.com/marvin/archive/2010/01/20/1652088.html 百度原CTO李一男经典语录 [1]好好规划自己的路,不要跟着感觉走 ...

  4. silverlight的第一个程序

    摘要:silverlight是微软公司全力打造的一种跨平台.跨浏览器的RIA新技术,silverlight以XAML为界面呈现语言,支持2D矢量图形.动画.数据绑定.控件风格与模板.LINQ.WCF. ...

  5. UML教程首页(转载)

    UML是一种标准语言,用于指定,可视化,构造和文档的软件系统的文物. UML是OMG在1997年1月提出了创建由对象管理组和UML1.0规范草案. 本教程给出了一个比较完整的学习理解UML,可以方便学 ...

  6. 使用WCF服务的客户端出现maxReceivedMessageSize异常

    使用WCF服务的客户端出现maxReceivedMessageSize异常解决方案 当使用WCF的客户端调取的数据过多时,会出现这个异常.一般情况下,系统默认值是65536,大约容纳100-200条左 ...

  7. BZOJ 1088

    真是智商不够, 智商题:.... 假如:第1,2个格子已知,然后根据第二列的情况,就可以把所有满足的情况推出来,又萌萌哒.. 无耻攒字数: #include<stdio.h> using ...

  8. PHP PDO_MYSQL 操作类 YAF嵌入高性能类而准备

    https://github.com/indieteq/PHP-MySQL-PDO-Database-Class PHP-PDO-MySQL-Class A PHP MySQL PDO class s ...

  9. 在 Java 中如何更高效地存储和管理 SQL 语句?

    [编者按]还在为管理 Java 代码中的 SQL 语句而烦恼吗?让 Zemian 帮你摆脱困境吧!本文系 OneAPM 工程师编译整理 注意:使用java.util.Properties#loadFr ...

  10. delphi一些小技巧 从别处看到

    开发环境--------    Delphi 7是一个很经典的版本,在Win2000/XP下推荐安装Delphi 7来开发软件,在Vista下推荐使用Delphi 2007开发软件.安装好Delphi ...