码迷,mamicode.com
首页 > 其他好文 > 详细

动态调用最新测试类

时间:2015-05-15 22:57:32      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:

需求分析:很多时候,我们不经意的经常要写一些测试方法,然而每次花时间都去新建一个项目,显然非常浪费时间。下面我针对测试项目需求,做了一个小型的测试项目,以供经常对一些方法和类做测试使用的项目来使用。

ITest接口:

//模拟普通启动的入口,至于更多的扩展功能,可以在这里定义。例如自带测试数据等.

public interface ITest

    {
        void Main(string[] args);
    }

在该项目下建立一个myClass类:

public class myClass:ITest
    {
        public void Main(string[] args)
        {
            Console.WriteLine("接口函数调用!"); 
        }
    }

由于我们每建立一个类,他都有一个新的特定就是,文件的时间是最新的,所以利用这个特性我们写个搜索的方法:


       /// <summary>
        /// 获取最新的项目.cs文件,并且满足继承ITest接口
        /// </summary>
        /// <param name="diWorkPlace">工作目录</param>
        /// <param name="StrPram">搜索条件</param>
        /// <returns>最新的文件.cs,并且满足继承ITest接口</returns>
        private static FileInfo GetLastFile(DirectoryInfo diWorkPlace,string StrPram)
        {
            FileInfo lastf=null;
            DirectoryInfo[] dis = diWorkPlace.GetDirectories();
            for (int i = 0; i < dis.Length; i++)
            {
                FileInfo tfi = GetLastFile(dis[i], StrPram);
                if (tfi==null)
                {
                    continue;
                }
                if (lastf == null || tfi.LastWriteTime > lastf.LastWriteTime)
                {
                    if (isWant(tfi))
                    {
                        lastf = tfi;
                    }
                }
            }


            FileInfo[] fis = diWorkPlace.GetFiles(StrPram);
            for (int i = 0; i < fis.Length; i++)
            {
                if (lastf == null||fis[i].LastWriteTime > lastf.LastWriteTime)
                {
                    if (isWant(fis[i]))
                    {
                        lastf = fis[i];
                    }
                }
            }
            return lastf;
        }


        /// <summary>
        /// 是否为需要的文件,在GetLastFile文件要用到
        /// </summary>
        /// <param name="lastFile">传入要做判断的文件</param>
        /// <returns>是为需要的</returns>
        private static bool isWant(FileInfo lastFile)
        {
            bool flg = false;
            string[] codes = File.ReadAllLines(lastFile.FullName, Encoding.Default);
            for (long i = 0; i < codes.LongLength; i++)
            {
                if (codes[i].Contains("namespace"))
                {
                    for (long j = i + 1; j < codes.LongLength; j++)
                    {
                        if ( codes[j].Contains("ITest")&&codes[j].Contains("class") )
                        {
                            int ib = codes[j].IndexOf("class");
                            int ie = codes[j].IndexOf("ITest");
                            if (ie>ib)
                            {
                                flg = true;
                            }
                        }
                    }
                    break;
                }
            }
            return flg;
        }

以上完成后,我们需要对该文件的里面类人进行筛选,得到全命名空间,以共反射使用:

         /// <summary>
        /// 返回符合ITest接口的全空间名称
        /// </summary>
        /// <param name="lastFile">最新的文件</param>
        /// <returns>命名空间名称</returns>
        private static string getFullName(FileInfo lastFile)
        {
            string FullName = "";
            string[] codes = File.ReadAllLines(lastFile.FullName, Encoding.Default);
            string NameSapce = "";
            string ClassName = "";
            for (long i = 0; i < codes.LongLength; i++)
            {
                if (codes[i].Contains("namespace"))
                {
                    NameSapce = codes[i].Replace("namespace", "").Trim();
                    for (long j = i + 1; j < codes.LongLength; j++)
                    {
                        if (codes[j].Contains("ITest") && codes[j].Contains("class"))
                        {
                            int ib = codes[j].IndexOf("class") + 6;
                            int ie = codes[j].IndexOf(":");
                            ClassName = codes[j].Substring(ib, ie - ib).Trim();
                            FullName = NameSapce + "." + ClassName;
                        }
                    }
                    break;
                }
            }
            return FullName;
        }

以上都是为下面的主函数做铺垫:

public class Program
    {
        public static void Main(string[] args)

        {

            Console.ForegroundColor = ConsoleColor.Yellow;
            DirectoryInfo di = new DirectoryInfo(Directory.GetCurrentDirectory());
            DirectoryInfo diWorkPlace = di.Parent.Parent;
            FileInfo lastFile = GetLastFile(diWorkPlace, "*.cs");
            string ClassFullName = getFullName(lastFile);
            var asm = Assembly.GetEntryAssembly();
            var typ = asm.GetType(ClassFullName);
            ITest instance = (ITest)asm.CreateInstance(ClassFullName);
            var method = typ.GetMethod("Main");
            instance.Main(args);
        }

}

总结:通过上面的主函数代码的实现,就可以实现只要一新建一个类实现ITest就可以智能的进入最新的类做测试了。


动态调用最新测试类

标签:

原文地址:http://my.oschina.net/robortly/blog/415471

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!