2011年8月25日
2009年12月17日
回归测试(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 的确得到了修复,并且没有在最后一个版本中“复发”,这是一个大规模的、全面的“回归测试”。
2009年10月23日
基本上,之前已经把MVC简要的学了一遍。现在就来深入看一下各个模块了。
ASP.NET MVC中的Routing是单独的一个模块,在整个ASP.NET架构中起到了很大的作用,而且应用越来越广泛。MVC就是其中之一。现在我们做的网站也好,应用程序也好,都是基于WebForm的。所以一般来说URL就反映了整个网站的结构。然后所有的参数传递一般就是通过QueryString或者Session,因为后者需要消耗服务器内存,如果不及时dispose的话,会给以后带来不少的麻烦,比如数据过期等等。结果就是Url的长度越来越大,让用户很难通过URL来知道现在究竟是在做什么,连接的意思代表什么。现在有了这个Routing,也就解决了这个问题。(其实,在Routing出现之前也有不少针对这个问题的的结局方案,比如之前的UrlRewriting什么的,关于比较他们的优缺点,就放在后面的日子里再去深入研究了。)
要构造一个好的Routing是需要去分析系统要呈现给用户的功能的。然后,在总结好应用程序功能的基础上,再加上一些原则,就可以构建出来了。
既然说到了构造Routing的原则,那我就把我的想法总结一下:
- 尽量保持URL短小精悍,如果最后构造出来的Url比WebForm时期还要冗长,那还不如不搞。
- 让用户通过Url就可以看出现在浏览的或者操作的意图,即让Url能够保持自我解释。
- 尽量不要把一些重要的ID显示在Url里面,尤其是那些整型变量的主键
- 还有呢,就是避免出现空格。这个是对搜索引擎的优化,更好的让你的Url出现在搜索引擎中。
在我们用VS的模板创建一个MVC网站后,在Globle.asax.cs文件里会有这么几行代码:
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
简要说一下。RouteTable.Routes是一个静态的RouteCollection类型对象,负责收集注册的Route。然后,在RegisterRoutes方法中,IgnoreRoute和MapRoute都是扩展方法。第一个是注册忽略的路径,后面那个是注册将要处理的路径。
在这里需要说明的是,注册Route的顺序决定了Route生效的优先级。越先注册优先级就越高。所以,应该把复杂的匹配模式放在前面,比较笼统的放在后面。
总而言之,Routing是MVC的入口,把它的原理掌握了有助于以后扩展我们的程序能更加顺手。
2009年10月22日
首先,我要说的是,ASP.NET MVC的这个View并不是简单的Page而已,它实现了接口IView
public interface IView {
void Render(ViewContext viewContext, TextWriter writer);
}
在ASP.NET MVC中,自带了一个默认的View那就是WebFormView
然后呢,在web请求到达controller,并且由controller返回ViewResult之后的操作,大概是这个样子的:
- ViewResult本身执行 ExecuteResult方法。这个方法是ActionResult接口的方法,ViewResult是实现这个接口的一个类。
- 找到相应的View
- 构造ViewContext
- Render
- 创建ViewPage
- 设置Layout位置
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 等等。以后再研究了,感觉第一次遇到这么多东西,总是有一点混乱。
继续了……
2009年10月20日
2009年10月15日
摘要: Model已经简单的看过了,在深入下去可能要讨论如何针对领域建模还有相关的设计模式等等,不是一两句能说清楚的。那么,这次就把眼光全部聚焦在Controller上吧。首先,要了解Controller的作用。如果没有Controller的话呢,所有的请求到要被导向View里面去,无形中使得View变得臃肿且不好维护,像是之前的WebForm。所以,Controller就是为了把处理请求这部分功能挪出来...
阅读全文
2009年10月14日
摘要: 在MVC模式当中,Model的意义最为深远,最重要。对于任何的程序或是软件来讲,如果没有一个好的Model,甚至是没有Model,那就没有任何的用处了。简而言之,Model就是软件的核心。在ASP.NET MVC中,它的这个Model不仅仅就是广义上的那个域模型,有时,它是基于域模型的变体,即表现模型(为了视图的显示而产生的模型)。域模型是指,一些对象,为了解决某个现实世界的问题,按照逻辑关系组织...
阅读全文
2009年9月29日
摘要: 这几天考虑了一下自己的发展方向,所以准备静下心来好好学点东西。那么就从asp.net mvc开始吧!首先,学这个mvc应该了解一下mvc的概念,这个网上几乎遍地都是。所以也就不罗嗦了。简而言之,就是Model-View-Controller的缩写。Web开发从一开始的CGI脚本,到微软的ASP,再到ASP.NET, 再至目前为止的MVC经历了不少的改革。从WebForm发展到MVC也算是大势所趋。...
阅读全文
2008年3月19日
摘要: 本地类型推断、Lambda表达式、扩展方法、对象初始化器、匿名类、查询表达式
阅读全文
2008年3月7日