停止使用重量级测试工具

专业的咨询师不仅需要对新兴的技术和趋势有足够的好奇心去探索,也要能够对过气的技术工具有自己的评价,这样当客户咨询师为什么做这样的技术抉择,而必须放弃手头已经的技术投资时,才能有足够的说服力。

这次要介绍的是2013年12月版ThoughtWorks Tech Radar中的Heavyweight Test Tool条目,状态是Hold。Hold就是建议停止使用。

… 

Share
 

形形色色的CI Monitor

个人的观点,持续集成是敏捷软件开发中最为重要的实践,没有之一。而加速反馈的重要方式,就是持续集成结果的可视化呈现,也即信息辐射器,作为团队监控软件构建状态的接口。专业的持续集成平台,不管是像ThoughtWorks的商业产品Go,还是CI开源世界代言人Jenkins,都提供了开箱即用的CI Monitor。

下面是Go的CI Monitor界面:

tw_go

… 

Share
 

第一个迭代计划

在Scrum中,整个团队会举行计划会议,以决定接下来的这个Sprint会做哪些事情,决定由PO和整个团队来做,依据就是优先级。PO会去选择那些从他的角度看优先级最高的,在上个Sprint已经完成工作的基础上,从Product Backlog中新添加那些对于软件用户来说最具优先级的特性,来交给团队实现。这里当然会有特别的情况,比如会有新添加的特性需求,也会有上个Sprint未完成的功能,还会有个别需要去掉的需求,需要PO在这里统筹安排,并和团队一起协商,达到一个最优化的选择和决定。

然而这里说的不是泛泛的迭代计划该怎么做,而是第一个迭代的计划该怎么做,根据什么依据或者原则来决定第一个迭代做哪些故事,我们会看到这里需要有更多的考量因素。

  • 可以组成MVP的那些故事。也有书里把MVP叫做MMF的,反正就是能够组成目前所要构建系统的最小价值组成。有个极端的例子,虽然当前需求的系统有很大的预算,也预见可以做一年,但突发情况要求只有一个迭代的时间,团队需要思考,从那么多需求中如何梳理出客户所需要的,真实的最基本的那些功能,能在一个迭代里面就可以交付的价值。这也是为客户负责,钱花得值,团队的努力有所回报而考虑的。可以认为从第二个迭代开始,从product backlog里面选取的故事,都是在丰富和扩充MVP。
  • 可以建立系统基本架构的那些故事。把那些有可能搭车系统的最基本架构的故事挑出来,这样最大的好处在于,能够尽早发现基础架构可能存在的问题,设计的问题,尽早避免在很久以后发现问题时,进行修补所带来的更大的代价。
  • 可能是技术难点和风险的故事。这些故事要尽早去做,从设计到开发到测试,把比较难的风险大的特性需求尽早完成,一直是TW团队所追求的,初衷同样是尽早消除这些技术难点和风险,并同时避免开发晚期遭遇这些技术难点和风险时,所招致的更大代价。
  • 找出处于依赖关系最底层的那些故事。也有可能是彼此间较少甚至没有依赖的故事,选择这些故事的目的在于,在迭代进行中可以不会因为故事之间的强依赖而发生开发或者测试依赖的问题。存在依赖关系的故事,可以放到先后不同的迭代里面来完成。
  • 可以让团队每个人都有活干。这一点的目的在于,选择出满足上一点的处于依赖最底层的故事后,还要确保能够并行开发的故事,就是每一对pair都能从迭代的第一天开始故事的开发,而不是有依赖和等待。这一点是对上一点的进一步优化。
  • 尽量可以让团队在第一迭代完成的故事。这会是一个估算的结果,但也是建立团队信心的需要。需要一个预测的点数,来成为以后估算出团队速率的基础值,这在选择第一个迭代的故事时,很重要的一个考量。

每一个迭代的计划过程,都是根据团队的实际情况,根据一些需求和因素来选择合适的故事进入开发流程。但对于第一个迭代来说,需要的考虑的因素稍微多一点。如上所述,每个因素间根据团队自己的特点和实际情况,会有所侧重,但结果期望会是一个相对正确的选择。

Share
 

物理墙和虚拟墙之争

在敏捷开发中,故事墙作为information radiator,在支撑整个软件团队的日常开发,可视化开发进度和开发中出现的问题,起到非常重要的作用。团队的开发状态和进度,在任何时刻,你只需要抬一抬头,就可以一目了然:当前谁在开发什么任务,是否有闲置的资源,开发和测试的工作分配是否合理,是否有过量的Bug等待修复,不一而足。

虚拟的电子故事墙也应运而生,比如Mingle和TFS,还有一些开源的产品经过改造后,也可以极度模拟实际的物理墙界面,并更加容易创建和编辑并删除。尤其在保存开发过程历史方面,比起物理墙有着得天独厚的好处。物理墙基本上只关注当前迭代的进程,在每次进入新的迭代,物理墙更新,上一迭代的故事卡片被回收或者遗弃,难以定位和回顾。虚拟墙因为信息化的本质,更容易搜索和存档,保留快照。此外,电子故事墙在统计和制作图表方面的功能,更是物理墙无法企及的。电子墙可以随着故事卡的挪动,动态算出当前状态下的各种数据,并渲染对应的实时更新的图表,为团队和客户提供数据和可视化方面的决策支持。更重要的,虚拟墙天生支持分布式开发,因为地区甚至时区有差异的团队,如果需要共用一个故事墙时,唯一的选择只能是虚拟墙,每一方团队都能看到时刻最新的故事墙状态。

如何解决好两者之间的关系,在ThoughtWorks内部以及客户的现场,我们都遇到了类似的问题。一般来说,团队自身或者开发者们更喜欢物理墙多一点,感受直观,把注意力和时间都聚焦在故事卡对应的任务本身,而不是被动地吸引在虚拟墙软件自身以及如何学习使用并挪动虚拟墙上的电子卡上(你会看见在站会时,每一位开发人员在挪动电子卡时会有多么奇怪而有趣的事情发生),对他们是更重要的事情。而对于团队的PM或者stakeholder们来说,虚拟墙可以远程打开,开发状态一目了然,更不用提统计和图表所提供的支持。

很多团队会选择两者都采用,但不得不问到以谁为主以及如何同步的问题。以谁为主还是比较好解决,物理墙面向开发团队,虚拟墙面向管理者和stakeholder们。所以最大的问题在于如何保持两者之间的数据同步。说白了就是,物理墙上的故事卡挪动,要及时在虚拟墙上反映出来,尤其虚拟墙软件对于故事卡的每一步挪动都会记录相应的数据变化,从而为精细的图表和统计提供数据,这样物理墙和虚拟墙之间的故事卡数据同步显得尤为重要。但现实情况和经验表明,数据同步做得很不如人意,开发者的关注点在物理墙,往往容易忘记及时更新虚拟墙上的故事卡,他们甚至对于这样一件重复的事情感到愤怒。而如果由PM每天下班前对两个故事墙做同步,又显得无聊之极。

怎么办?我更相信鱼和熊掌不可兼得,对于一个团队,如果既要享受物理墙带来的可视化和信息辐射的好处,又需要虚拟墙带来的强大的编辑、统计以及图表功能,就不得不去承担因为同步二者的故事卡数据所带来的辛苦甚至是痛苦。选择团队的开发人员来各自负责同步两个墙之间的数据,还是由PM每天找一个正确的时间来同步,都是由团队自己来决定,至少我们是这么做的。你还有其他的办法吗?

Share
 

测试向敏捷要什么?

敏捷软件开发与其他软件开发方法学最大的区别,在于敏捷是承认并拥抱变化的。为了这样的变化,敏捷的不同方法,比如极限编程、Scrum引入不同的技术实践和流程,像持续集成、测试驱动开发以及短迭代周期等,来确保即使在需求的快速变化下,也能保证交付的软件总是满足用户的需求,是高质量的价值交付。

从敏捷软件开发宣言来看,并没有涉及测试的内容,更不用提为QA即测试人员提供指导性的建议。就是以极限编程的14个推荐实践来看,表面上对于测试的提及也只是验收测试,甚至没有敏捷测试这个概念。这样让很多人一度认为敏捷软件开发是不是之以程序开发为导向的,是不是我们测试人员能从敏捷获得的直接支持少之又少,我们是不是被遗忘的一个种群?

答案必然是否定的。还以极限编程为例,除了验收测试以外,极限编程提及的完整团队、用户故事、短交付周期、持续集成等实践,都在从不同的维度对于测试工作的流程和方式甚至对它思考的角度提出了变化的要求。

完整团队从文化氛围和组织结构上明显区别与过往的测试人员参与感,测试人员不再是对软件系统质量负责的唯一角色,对质量负责的是全体团队成员的职责。用户故事改变以前对于软件系统功能和模块的划分,而是从交付的独立价值出发,改变了测试人员对于测试案例准备和验收的方法。短交付周期,无论是两周还是四周,都给整个团队带来了巨大的变化,开发和测试不再是独立而又顺序的过程,开发和测试互相穿插,成为一个快速反馈的过程。持续集成是软件系统开发过程的晴雨表,其中价值相当大的自动化测试仍然和我们的测试工作脱不了干系。

可见,敏捷和它的方法,虽然没有显式地给测试工作以指导建议,但隐式地要求了我们测试人员仔细思考测试本身在敏捷项目中所需要发生的变化,我们测试人员的职责和工作范畴发生了哪些变化。

与敏捷开发一样,敏捷测试针对不同的项目上下文和不同的团队组成和背景,有不同的适配模式。跟敏捷软件开发的宣言类似,敏捷测试也有一系列可以恪守的原则。经过不断实践和经验,ThoughtWorks的同事同样提出了《敏捷测试宣言》:

  1. Collaborative ownership over detached objectivity
  2. Targeted automation over widespread anti-regression
  3. Defect prevention over defect reporting
  4. Exploratory testing over predetermined scripting

第一点与完整团队有关。虽然独立的测试团队可以从外部视角观察软件质量,但真正的软件质量来自测试人员属于一部分的完整团队,不再区分彼此的开发团队和测试团队,不再有彼此分离的目标。整个团队为软件质量和客户价值共同负责。

第二点针对性自动化测试胜过广泛的回归测试。随着软件系统开发的进展,后期引入的新功能和缺陷都会带来大量和重复的回归测试,自动化测试是代替人工繁琐而无聊的回归测试的唯一办法。

第三点提到的如何对待缺陷恐怕是时下各个测试团队最为纠结的内容了。预防缺陷胜过报告缺陷,预防缺陷才是测试工作最大的价值所在。敏捷测试会尽早介入软件系统的开发过程,和业务分析师、客户分析需求和价值所在,以用户故事和验收条件来驱动开发,以短周期迭代和持续集成为反馈,可以尽早发现存在的缺陷,从而极大降低后期才报告以及修复缺陷所带来的高额成本。在我的团队,测试人员甚至可以和开发人员结对,共同确认缺陷根源,修复缺陷,并添加自动化测试确保缺陷不会再次发生。

第四点的探索性测试的重要性没有人会怀疑,测试人员可以凭借自己的经验积极、自由地发现质量问题,而不仅仅是反复运行已经定义好的测试。这样可以证明软件不仅仅做了它该做的事情,还证明软件没有做它不该做的事情。

Share
 

ORM + 遗留数据模型 = 伤不起

最近在项目中遭遇的问题,是ORM + 遗留数据模型的问题。

一个有十年以上历史的遗留系统,包括它的数据库。要在它的上游,搭建一套Web API,供更多三方系统调用和集成。为了给不同的三方系统提供统一的数据交换接口,特地建立起一套完备(至少目前是)的数据模型,并在数据库中对应设表建模。

这样一个势在必行的工作就是,在需要保持遗留系统继续无障碍工作的前提下,要实现从新数据模型到遗留数据模型之间的数据转换。客户要求使用的是NHibernate来做ORM。

问题就在于当需要将新数据模型和遗留数据模型相互关联时,ORM显得力不从心。新数据模型,独立的实体,清晰的关系,满足ORM对于数据表及关系的定义要求,换句话说新数据模型就是为ORM量身定做。而遗留数据模型,最早建立的时间还是ORM乃至Hibernate方兴未艾之际,历经时间和人手的洗礼,数据模型和表定义混乱糅杂,关系不清晰或者表达错误。

一个突出的例子就是,明明是多对一关联,却凭白增加第三张关联表,变成多对多关联。按照NHibernate的关联定义需求,映射到对象层,会出现一个列表类型的字段中只会存有一个关联对象的奇观,用脚趾头也可以想象出这是如何地说不通。

最近一周投入在这上面的时间着实太多,感触是NHibernate或者是ORM到底是在引导良好的建模实践,还是在无法有效表示遗留数据模型及关系时,纵容了不合业务的对象关系呢?

好吧,按照老马的说法,还是要给ORM更多的宽容和同情心,毕竟它给我们解决了80%我们不愿意面对的重复代码问题。不要寄希望于ORM太高,更不要苛求它。即使使用ORM,也要对它所操作的数据库层面的数据变化,有自己的深入的理解。

Share
 

Add Sonar Support for .NET Project in Jenkins

My project is a .NET project, being built on running Jenkins. I would like to use Sonar to analyze this project to improve code quality.

Here are the steps to setup Sonar for .NET project:

  1. Download Sonar zip file, unzip and run bin/StartSonar.bat (on Windows 2008), then Sonar could be accessed from: http://localhost:9000
  2. Download and install(copy to Sonar plugins folder) .NET plugins for Sonar, http://docs.codehaus.org/display/SONAR/C-Sharp+Plugins+Ecosystem
  3. Install bunch tools for code quality: Gallio, FXCop, PartCover, Source Monitor, NDeps, according to http://choudhury.com/blog/2011/06/12/using-sonar-for-your-net-project/
  4. Download sonar runner, for future use.
  5. Download maven for future use.
  6. For 64-bit OS, use forFlags.exe to patch PartCover.exe and Gallio.Echo.exe, which are 32-bit, according to http://choudhury.com/blog/2011/06/12/using-sonar-for-your-net-project/
  7. Compile .NET solution/project under Debug but not Trunk, which are required by NDeps.
  8. Take following either way to analyze project:
    1. add sonar-project.properties under same folder with sln file, and add key ‘sonar.fxcop.installDirectory‘ with value of real FXCop installation in case console throws error. Do same thing for NDeps, as ‘sonar.ndeps.installDirectory
    2. add pom.xml, according to http://svn.codehaus.org/sonar-plugins/trunk/dotnet/tools/dotnet-tools-commons/src/test/resources/solution/Example/, and run ‘mvn clean install -Psonar-dotnet sonar:sonar
  9. Go to http://localhost:9000 to check Sonar report.

Add Sonar plugin in Jekins job – TBD

Share