CruiseControl.net - 找到的一些文档。分享出来
/Files/everx/Continuous_Integration_From_Theory_to_Practice_2nd_Ed.pdf
/Files/everx/Continuous_Integration_From_Theory_to_Practice.pdf
/Files/everx/Continuous_Integration_From_Theory_to_Practice_2nd_Ed.pdf
/Files/everx/Continuous_Integration_From_Theory_to_Practice.pdf
回归测试(Regression Test) 问:我听说不少关于Regression Test的介绍,但是它到底是怎么“回归”法?回归到哪里去?我还是没搞懂。 答:Regress 的英语定义是: return to a worse or lessdeveloped state。是倒退、退化、退步的意思。 在软件项目中,如果一个模块或功能以前是正常工作的,但是在一个新的构建中出了问题,那这个模块就出现了一个“退步”(Regression),从正常工作的稳定状态退化到不正常工作的不稳定状态。 在一个模块的功能逐步完成的同时,与此功能有关的测试用例也同样在完善中。一旦有关的测试用例通过,我们就得到了此模块的功能基准(Baseline)。 假如,在3.1.5版本,模块A的测试用例125是通过的,但是测试人员发现在新的版本3.1.6,这个测试用例却失败了,这就是一个“倒退”。在新版本上运行所有已通过的测试用例以验证有没有“退化”情况发生,这个过程就是一个“Regression Test”。如果这样的“倒退”是由于模块的功能发生了正常变化(由于设计变更的原因)引起的,那么测试用例的基准就要修改,以便和新的功能保持一致。 针对一个Bug Fix(拖鞋),我们也要作Regression Test。 (1)验证新的代码的确把缺陷改正了。 (2)同时要验证新的代码没有把模块的现有功能破坏,没有Regression。 所以对于“回归测试”中的“回归”,我们可以理解为“回归到以前不正常的状态”。 回归测试最好要自动化,因为这样就可以对于每一个构建快速运行所有回归测试,以保证尽早发现问题。在微软的实践中,在一个项目的最后稳定阶段,所有人都要参加测试,以验证所有已经修复过的 Bug 的确得到了修复,并且没有在最后一个版本中“复发”,这是一个大规模的、全面的“回归测试”。
基本上,之前已经把MVC简要的学了一遍。现在就来深入看一下各个模块了。
ASP.NET MVC中的Routing是单独的一个模块,在整个ASP.NET架构中起到了很大的作用,而且应用越来越广泛。MVC就是其中之一。现在我们做的网站也好,应用程序也好,都是基于WebForm的。所以一般来说URL就反映了整个网站的结构。然后所有的参数传递一般就是通过QueryString或者Session,因为后者需要消耗服务器内存,如果不及时dispose的话,会给以后带来不少的麻烦,比如数据过期等等。结果就是Url的长度越来越大,让用户很难通过URL来知道现在究竟是在做什么,连接的意思代表什么。现在有了这个Routing,也就解决了这个问题。(其实,在Routing出现之前也有不少针对这个问题的的结局方案,比如之前的UrlRewriting什么的,关于比较他们的优缺点,就放在后面的日子里再去深入研究了。)
要构造一个好的Routing是需要去分析系统要呈现给用户的功能的。然后,在总结好应用程序功能的基础上,再加上一些原则,就可以构建出来了。
既然说到了构造Routing的原则,那我就把我的想法总结一下:
在我们用VS的模板创建一个MVC网站后,在Globle.asax.cs文件里会有这么几行代码:
简要说一下。RouteTable.Routes是一个静态的RouteCollection类型对象,负责收集注册的Route。然后,在RegisterRoutes方法中,IgnoreRoute和MapRoute都是扩展方法。第一个是注册忽略的路径,后面那个是注册将要处理的路径。
在这里需要说明的是,注册Route的顺序决定了Route生效的优先级。越先注册优先级就越高。所以,应该把复杂的匹配模式放在前面,比较笼统的放在后面。
总而言之,Routing是MVC的入口,把它的原理掌握了有助于以后扩展我们的程序能更加顺手。
首先,我要说的是,ASP.NET MVC的这个View并不是简单的Page而已,它实现了接口IView
在ASP.NET MVC中,自带了一个默认的View那就是WebFormView
然后呢,在web请求到达controller,并且由controller返回ViewResult之后的操作,大概是这个样子的:
ViewPage(System.Web.Mvc.ViewPage)和之前的WebPage(System.Web.UI.Page)主要的区别是,的唯一的也是最重要的功能就是呈现页面。摒弃了WebPage的ViewState,PageEvents,Control层级关系。从代码看,ViewPage实现了IView接口,而这个接口仅有一个方法,那就是Render。可见其功能已经很确定了。
ViewEngine在MVC中是用来确定View的。也就是说,它负责找到特定的视图。默认的那个ViewEngine是WebFormViewEngine。如果呢,我们想要换一个视图,不想继续用aspx页面了,那么就需要重新构造一个ViewEngine,并注册到系统里。
Layout就相当于是MasterPage,不同的是,它没有了PostBack机制和表单提交机制。也就是说,它只能够为ViewPage布局。
ViewData之前已经说过一些了,View用它来呈现页面。不过,在这里要说的就是,一个View就只是对应一个ViewData,如果在一个View中有其他的PartialView,那么它们之间的ViewData是不共享的,虽然默认情况下内容是相同的。
View还有一些其他的知识,比如:BindAttribute,ModelState 等等。以后再研究了,感觉第一次遇到这么多东西,总是有一点混乱。
继续了……
接着上次说的,这次继续说一下Controller的其他功能。
首先是IModelBinder接口。它只有一个方法:
这个方法可以将用户输入(Form,Route,Querystring)转换成我们自定义的类。ASP.NET MVC自身自带了一个Model Binder:DefaultModelBinder。它可以将输入值转换成.net 的原生类型,甚至是IList类型。但是如果我们需要将输入转换成自定义的类型的话,就需要进行扩展了。具体的用法,现在我还不是很清楚,还需要继续探索。但是可以知道的是,一旦自定义了一个Model Binder,就必须在Globle.asax中进行注册才行。
然后,就是说一下Controller的filter。filter的功能就是在ASP.NET MVC的请求过程中,插入自己的逻辑代码。其中,有4个接口是用于filter功能的:IActionFilter、IResultFilter、IAuthorizationFilter、IExceptionFilter。
可以看出,这些方法有一点像是WEBFORM中熟悉的那些页面生命周期事件。这些方法的执行顺序大概是:OnAuthorization -> OnActionExecuting -> OnActionExecuted -> OnResultExecuting -> OnResultExecuted -> OnException。当然最后那个OnException是不定的,因为一旦出现异常,程序就会立即执行这个方法。
Controller类,已经实现了这几个接口,所以我们就可以通过覆盖实现这几个方法来插入自定义逻辑。但是,还有一种更好的方法,就是使用FilterAttrbute,来插入自定义逻辑。这样做有一个很大的好处,那就是,我们可以针对某个Action进行逻辑操作,而不必操作整个Controller的所有Action。MVC默认给我们提供了几个Attribute。我们也可以编写我们自己的Attribute。写法大概就是,1.继承FilterAttribute 2.实现相应的接口 (上面所说的那4个)。
关于Controller就说到这了,还有很多需要继续深入的地方。后面在慢慢补充吧。