MVC开发单元测试小工具 —— 搜寻还没写单元测试的方法

方法比较笨,有更好的建议可以提。

写这个工具呢,因为要写单元测试,保证代码质量,方便修改维护。一切为了自己方便。当然这个算是个人开发的项目

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);
        }

  

 

posted @ 2020-06-23 18:53  兮去  阅读(199)  评论(0编辑  收藏  举报