零成本建立的.NET小组开发平台
前言
说道.NET开发平台,首先想到的就是Visual Studio,建立.NET小组开发平台自然首推TFS。但其花费却也是相当昂贵的(当然在本国可以无视这些成本),近期的开发中接触到一些开源软件并读了《Agile .NET Development with Scrum》一书后发现通过使用一些免费开源软件也能建立起一个功能强大的小组开发平台。
所需软件
软件 | 版本 | 网址 | 说明 |
---|---|---|---|
Visual Studio | 2008/2010/2012 Express Edition | http://msdn.microsoft.com/en-US/vstudio/ | 既然免费就只能选Express Edition了,本国的可以直接Ultimate |
Nunit | 2.6.2 | http://www.nunit.org | 如果VS用了Ultimate,那这个就不用下了(IDE已经内置了) |
SpecFlow | 1.9.2 | http://specflow.org | |
Moq | 4.0.10827 | http://code.google.com/p/moq | |
Pivotal Tracker | http://www.pivotaltracker.com | ||
WatiN | 2.1 | http://watin.org | |
JMeter | 2.9 | http://jmeter.apache.org/ |
本文唯一需要JAVA运行时的工具,功能强大。 |
VisualSVN Server | 2.59 Standard Edition | http://www.visualsvn.com/server | |
TortoiseSVN | 1.7.12 | http://tortoisesvn.net/ | |
AnkhSVN | 2.4 | http://ankhsvn.open.collab.net/ | |
CruiseControl.NET | 1.6.7981.1 | http://ccnet.thoughtworks.com |
PS:以上网址截止到2013/5/22可用,记载的版本号都是最新版的版本号
单元测试
说单元测试的文章已经太多,Nunit 的使用帮助也随处可见,话说钱要花在刀刃上,字也要写在重点上:这里只写下类似 Moq 的模仿工具在单元测试中的使用。
首先列一下单元测试为什么需要这些模仿工具的原因:
- 当需要测试的模块有许多依赖项,而你想把测试范围限定在本模块的时候(你可以模拟出这些依赖项)
- 当你先开发/测试上层模块,而依赖的下层模块尚未完工(你可以模拟出下层模块提供的接口)
- 测试的机能与动态的环境变量相关时(你可以模拟出这些动态环境变量:返回固定值/可预知的值)
使用示范:
假设你新建了一个Product 类,其中有一个 GetPriceWithExtendedWarranty 方法,传入一个计算接口,返回一个合计值。
public class Product { public decimal Price { get; set; } public decimal GetPriceWithExtendedWarranty (IWarrantyCalculator calculator) { return calculator.GetWarrantyPrice(Price) + Price; } } public interface IWarrantyCalculator { decimal GetWarrantyPrice(decimal price); }
然后写一个该方法的测试:
[Test] public void verify_WarrantyCalculator_Equals_15() { Product prod = new Product {Price = 10}; // 使用Moq建立一个模拟的IWarrantyCalculator Mock<IWarrantyCalculator> fakeWarrantyCalculator = new Mock<IWarrantyCalculator>(); // 定义该虚拟对象的 GetWarrantyPrice 方法的具体实现(为了便于测试此处总是返回5) fakeWarrantyCalculator.Setup(warranty => warranty.GetWarrantyPrice(prod.Price)).Returns(5); // 正式开始测试(把这个虚拟对象传递给Product的GetPriceWithExtendedWarranty方法) decimal calculatedWarranty = prod.GetPriceWithExtendedWarranty(fakeWarrantyCalculator.Object); // 确认虚拟对象的GetWarrantyPrice方法被调用到了 fakeWarrantyCalculator.Verify(warranty => warranty.GetWarrantyPrice(prod.Price)); // 确认最终结果 Assert.AreEqual(calculatedWarranty, 15); }
支持行为驱动开发(BDD)的单体测试
实现行为驱动开发之所以比较难,是难在把需求的交流转换成规范的,详细的源代码级的表述。这里提到的SpecFlow 能够一定程度上帮助我们把各个需求行为用自然化的语法表述出来,并生成对应场景的测试用例。
使用示范(假设你已安装好SpecFlow):
官网有图文并茂的示例,这里就偷个懒付个链接(http://www.specflow.org/specflownew/ProjectSetupGuide.html)。另外需要指出虽然示例中使用了NUnit,它还支持许多其他单体测试工具(包括 VS 内置的单体测试机能),支持的列表请参见连接(https://github.com/techtalk/SpecFlow/wiki/Unit-test-providers)。
如果你要使 SpecFlow 生成 VS 的单体测试项目,则需要建立一个配置文件(app.config),并设置以下内容。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="specFlow" type="TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow"/> </configSections> <specFlow> <unitTestProvider name="MsTest" /> </specFlow> </configuration>
PS:与 SpecFlow 相关的所有设定项目可以参考这里(https://github.com/techtalk/SpecFlow/wiki/Configuration)
Scrum 管理平台
Scrum 开发中真个开发任务分成一个个Sprint,然后什么Product Backlog,Sprint Backlog,Story 以及个人的开发状态等等都需要管理起来并随时更新,这是一项艰巨的作业。
所以必须需要一个项目管理平台来简化这个工作,Pivotal Tracker 就是一个比较好的工具,它提供了以上所有内容的管理功能,并且能生成实时的图表。
(可惜我们小组并未采用该平台,我也没什么实际使用经验,所以有兴趣的自己搞一个研究下吧。)
Web 测试
1. 这里首先介绍的工具 WatiN 是一个用于 WEB 单元测试的工具,使用类似以下的代码就可以向 Web 服务器发出请求,并验证响应信息:
using NUnit.Framework; using WatiN.Core; namespace WatiN_Tests { public class RemoteWebSiteTest { [Test] public void verify_Title() { using (var ie = new IE(http://www.csdn.net, true)) { Assert.IsTrue(ie.Title.Contains("csdn")); } } } }
是否非常简单呢?由于该工具采用代码方式,所以测试可以自由定制,唯一的缺点是需要敲代码:(
2. 如果你像我一样懒,建议你把这个工具藏起来,然后下载 Jmeter 并介绍给你的项目负责人(耳语:让评价人员使用自动化工具测试我们的项目吧~~)
Jmeter 是个基于 JAVA 的免费测试软件,功能也是相当的强大而且能录制各种 WEB 请求,并且记录下每个请求获取到的结果以及响应时间,最近的版本已经能够通过多台测试机互联进行分布式测试。由于该工具相关的文档在csdn上已经很多,所以这里就也偷懒略过了,花些篇幅来介绍另一个实用工具 PAL:
3. 通常在测试的时候都会被要求使用性能分析器来记录服务器的负载状况,一大堆的性能指标着实让人摸不着头脑,怎么该?怎么该?这时你可以去http://pal.codeplex.com/ 下载 pal,该工具能分析性能分析器的日志文件(*.blg, *.csv)并生成图表,同时标记出有问题的指标。现在该工具还只能生成英文的报告,建议英语好的朋友联系下源作者,翻译下下,造福人类:)
源代码管理
源代码管理工具大致有cvs, svn, vss, git, tfs,如果是用VS开发当然首推tfs,前些时候微软也发觉 git 的强大潜力立刻在tfs中支持了git,所以即使你偏爱 git 依然可以使用 tfs 并享用 tfs 提供的强大协作功能。
vss 最新版也已经是 2005 的古董版,越来越为人不屑,不过如果你的项目不大,只牵涉局域网中几个人,版本更迭很少那也不妨一用。这里主要介绍下建立基于 SVN 的源代码管理环境:SVN是免费的,另一方面功能并不弱于 git。
- 首先你需要建立一个 SVN Server,这里推荐使用 VisualSVN Server,一方面它是免费的,另一方面安装完成后直接支持 http 方式的访问,非常傻瓜化。(TortoiseSVN 虽然也能建立 SVN Server,但默认只能通过共享目录来访问)。
- 客户端我们没有采用 VisualSVN,原因是它是收费的!!所以 TortoiseSVN 出场,它与 windows 中的资源管理器集成在一起,通过图标来表示各个文件的状态非常直观。
- 对于懒惰的开发者来说,SVN 缺少 IDE 的支持是不可容忍的,我们需要在 IDE 中就能看到项目文件的状态,并签入/签出。幸运的是我们有 AnkhSVN 的 VS 插件,你能在 IDE 中进行几乎所有 SVN 客户端操作。
持续化整合
持续化开发是当今开发流程的一个趋势:保证了签入代码的可编译性,随时能有可运行的程序...。微软的 tfs 已经内置该功能,我们没钱就只能用别的了: CruiseControl.NET。
博客源中一个详细描述怎样配制的系列文章:http://www.cnblogs.com/cnblogsfans/archive/2008/04/23/1167292.html