asp.net mvc 自动化测试工具
来源:互联网 发布:php 取字符串前几位 编辑:程序博客网 时间:2024/05/23 02:05
好久不写文章了,一直忙在项目中。
前一阵发现公司一个项目,体积巨大。业务很复杂。基于历史原因,项目基于mvc 2迁移过来,视图大多还是aspx 作为视图承载。
控制器中的方法 更是一个比一个多。
由于站点使用了许多开源组件,整个Bin 编译出来有将近200M!
而且里面在站点启动的时候,对远程的服务代码 进行了动态编译!导致启动一次项目很慢,调试很麻烦 等待很久,很是捉急...........
想测试个控制器的Action ,要么写代码测试,要么有HttpContext的那种 只能干等待。于是想了想,要是有能自动模拟 iis的测试工具,直接监视请求,然后调试源码。
实现原理:
基于 Owin的 Mvc 自承载。
mvc项目自承载,一个基于Owin的命令行程序,在启动的时候,Startup 中,host mvc 站点项目即可。然后就可以模拟Iis 承载mvc ,启动迅速,也不用写单元测试代码,对于复杂的
参数,也不用代码构建了。
一个比较头大的问题是:自承载的处理模型跟 iis 承载的处理模型不一样。
Owing是基于 模块组件的方式,构成调用链。对注册的中间件进行链式的调用,全程使用一个OwinContenxt
IIs 是基于管道模型,将请求 封装到 HttpConxt 中,然后基于事件的形式 在 注册的Module Handler中穿梭。
要进行模拟IIS 就必须模拟HttpContext对象!!!(除非 项目完全抛弃了使用这个对象----0-0--)
如何模拟?不好模拟,因为微软团队将这个对象的很多属性 /字段 要么 是只读的 要么是私有的。所以,只能不走寻常路:反射赋值!!!
比如:
核心代码: SimpleWorkerRequest
提供的简单实现 HttpWorkerRequest 抽象类可以使用 Internet 信息服务 (IIS) 应用程序外部托管 ASP.NET 应用程序。 您可以采用SimpleWorkerRequest 直接或对其进行扩展。
通过 SimpleWorkerRequest 构建HttpContext 对象
然后通过反射,对非公开的字段/只读属性进行赋值
Type appFactoryType = Type.GetType("System.Web.HttpApplicationFactory, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"); object appFactory = ReflectionHelper.GetStaticFieldValue<object>("_theApplicationFactory", appFactoryType); ReflectionHelper.SetPrivateInstanceFieldValue("_state", appFactory, HttpContext.Current.Application); }
要加载那些dll 中的代码,就构建加载对应的Type 然后 反射赋值即可!
一旦能承载,那么 接下来无非就是对Mvc 的请求解析。。。(owin 自承载可以自动解析webapi的控制器,所以 对于混合项目 或者mvc项目,将mvc解析请求的基本步骤实现即可)
1 var controllerOfMvc = Activator.CreateInstance(controllerDescription.ControllerType) as Controller; 2 3 IHttpRouteData routeData = GlobalContext.config.Routes.GetRouteData(requestMessage); 4 var mvcRouteData = new RouteData(); 5 var paras = new Dictionary<string, object>(); 6 foreach (var item in routeData.Values) 7 { 8 mvcRouteData.Values.Add(item.Key, item.Value); 9 paras.Add(item.Key, item.Value);10 }11 var ctrlContext = new ControllerContext(httpContextBase, mvcRouteData, controllerOfMvc);12 var actionDescription = controllerDescription.FindAction(ctrlContext, actionName);13 14 if (null != actionDescription)15 {16 var actionResult = actionDescription.Execute(ctrlContext, paras) as ActionResult;17 18 string resultText = string.Empty;19 if (actionResult is JsonResult)20 {21 var data = (actionResult as JsonResult).Data;22 resultText = JsonConvert.SerializeObject(data);//序列化数据23 24 }25 else if (actionResult is ViewResult || actionResult is PartialViewResult)26 {27 //解析模板 实现的核心就是 视图文件虚拟化 VirtualPathProvider and 动态编译 var clientBuildManager = new ClientBuildManager(rootVirtualPath, GlobalContext.SitePhysicDir);28 /*29 如果 有需要 可以尝试开发出来。参考资料:30 http://blog.rebuildall.net/2009/11/17/asp_net_mvc_and_virtual_views31 https://blog.falafel.com/how-to-load-views-from-assembly-in-mvc/32 https://msdn.microsoft.com/en-us/library/system.web.hosting.virtualpathprovider(v=vs.110).aspx33 http://www.binaryintellect.net/articles/e544d1d3-e47e-4ced-bd4d-8c1eaefbdc31.aspx34 http://www.danielroot.info/2013/07/reuse-mvc-views-using-virtual-path.html35 https://github.com/aspnet/Mvc/issues/375036 http://www.chrisvandesteeg.nl/2010/11/22/embedding-pre-compiled-razor-views-in-your-dll/37 https://stackoverflow.com/questions/236972/using-virtualpathprovider-to-load-asp-net-mvc-views-from-dlls38 https://stackoverflow.com/questions/24341336/is-it-possible-to-access-mvc-views-located-in-another-project39 http://ericsowell.com/blog/2007/4/3/the-asp-net-virtual-path-provider-an-example-implementation40 http://tech.trailmax.info/2014/02/attempt-to-do-view-compilation-for-azure-web-role/41 http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/BuildManagerCompiledView.cs42 http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/BuildManagerCompiledView.cs43 */44 throw new NotImplementedException();45 46 string viewName = RenderHelper.ViewNameFromActionResult(actionResult);47 if (string.IsNullOrEmpty(viewName))48 {49 viewName = actionName;50 }51 //定制 路径 不基于mvc标准52 string viewPath = System.IO.Path.Combine( "~/Views", controllerName, string.Concat(actionName, ".aspx")).Replace("\\","/");//暂时没有ascx53 //54 resultText = RenderHelper.RenderWebFormViewToString(ctrlContext, actionResult, viewPath);//RenderHelper.RenderActionResultToString(ctrlContext, actionResult, mvcRouteData, controllerOfMvc);55 56 }
- asp.net mvc 自动化测试工具
- .NET Web 自动化测试工具
- asp.net mvc脚手架代码生成工具
- ASP.NET MVC 2 转换工具
- 使用asp.net mvc 的工具提示
- 基于 SSL 的 ASP.NET Web 应用程序测试自动化
- 【经典】基于 SSL 的 ASP.NET Web 应用测试自动化
- 测试 ASP.NET WebService 工具 SoapUI
- 用vs.net中的测试工具测试asp.net程序
- 用VS.NET中的测试工具测试ASP.NET程序
- 自动化测试工具
- Selinium测试自动化工具
- 自动化测试工具
- 自动化测试工具汇总
- Selenium 自动化测试工具
- 自动化测试工具汇总
- 自动化测试工具简介
- 自动化测试工具汇总
- 三维软件Skyline开发初步
- TR中工件的选型问题
- 游戏开发学习路线图
- Java排序算法——归并排序
- HelloWorld改编,仿bilibili手机端(一)——侧滑菜单界面布局
- asp.net mvc 自动化测试工具
- Hexo+Pages静态博客-Next主题篇
- 机器学习(4)分类之集成方法
- Android ConstraintLayout 使用详解
- Matplotlib库学习(一)plt.plot
- 【Windows 10 应用开发】细说文本资源文件(resw)
- python计算RGB图片H通道
- CountDownTimer用法
- c++primer 6.3.3节练习(返回数组指针的4个方法)