方法比较笨,有更好的建议可以提。
写这个工具呢,因为要写单元测试,保证代码质量,方便修改维护。一切为了自己方便。当然这个算是个人开发的项目
1、MVC中控制器建立个基类(这个光明正大的抄袭的),控制往前端传输的数据格式
2、所有控制器继承这个基类
3、在单元测试项目建立自定义特性,方便关联搜寻(我是没找到更好的办法关联,VS肯定是有关联的,奈何我找不到,各位有好的建议可以提)
4、写单元测试并加上特性
5、写小工具
6、小工具获取两个项目之间已存在的方法进行筛选。大概就下面这样吧。当然前提引用两个项目的程序集
/// <summary> /// 测试用例没写到的方法 /// </summary> public class NotTestFun { public List<string> GetNotTestFun() { //web程序集中控制器的方法 List<string> controllerFun = new List<string>(); //单元测试程序集中的测试方法 List<string> testControllerFun = new List<string>(); //还没写单元测试的方法 List<string> notTestFun = new List<string>(); Assembly assembly = Assembly.Load("Manage.Web"); Assembly assembly2 = Assembly.Load("Manage.Web.Tests"); controllerFun = assemblyFun(assembly); testControllerFun = assemblyFunTest(assembly2); foreach (var item in controllerFun) { string a = item; foreach (var item2 in testControllerFun) { if (item==item2) { a = ""; } } if (a!="") { notTestFun.Add(a); } } return notTestFun; } /// <summary> /// 获取web程序集中所有继承自写基类控制器的方法 /// 自写基类控制器 MvcControllerBase /// </summary> /// <returns></returns> public List<string> assemblyFun(Assembly assembly) { List<string> controller = new List<string>(); List<string> controllerFun = new List<string>(); Type[] types = assembly.GetTypes(); Type aType = typeof(MvcControllerBase); List<MvcControllerBase> alist = new List<MvcControllerBase>(); foreach (Type type in types) { if (type.BaseType.Name == "MvcControllerBase" && type.BaseType.FullName == "Manage.Web.Controllers.MvcControllerBase" ) { controller.Add(type.Name); //获取控制的所有方法 foreach (var item in type.GetMethods()) { //是视图控制器 if (item.ReturnType.Equals(typeof(System.Web.Mvc.ActionResult)) && item.DeclaringType.Name != "MvcControllerBase" ) { controllerFun.Add(type.Name + "." + item.Name); } } } } return controllerFun; } /// <summary> /// 获取单元测试中的测试方法 /// 根据自写特性关联控制器 /// </summary> /// <returns></returns> public List<string> assemblyFunTest(Assembly assembly) { List<string> controller = new List<string>(); List<string> controllerFun = new List<string>(); Type[] types = assembly.GetTypes(); Type aType = typeof(MvcControllerBase); List<MvcControllerBase> alist = new List<MvcControllerBase>(); foreach (Type type in types) { controller.Add(type.Name); //获取控制的所有方法 foreach (var item in type.GetMethods()) { //CustomAttributes特性有2个,一个是TestMethod一个是TestAttr //不同程序可自调 CustomAttributeData cd = item.CustomAttributes.SingleOrDefault(a => a.AttributeType == typeof(TestAttr)); if (cd!=null) { var list = cd.NamedArguments.ToList(); controllerFun.Add(list[0].TypedValue.Value.ToString()); } } } return controllerFun; } }
------------------这是特性和单元测试---------------------------------- /// <summary> /// 此特性用于开发小工具查看未写到的测试方法 /// </summary> [AttributeUsage(AttributeTargets.Method)] public class TestAttr : Attribute { public string TestClassFun { get; set; } } [TestMethod] [TestAttr(TestClassFun= "TeamController.Index")] public void Index() { ViewResult result = controller.Index() as ViewResult; Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsNotNull(result); }