需求分析:很多时候,我们不经意的经常要写一些测试方法,然而每次花时间都去新建一个项目,显然非常浪费时间。下面我针对测试项目需求,做了一个小型的测试项目,以供经常对一些方法和类做测试使用的项目来使用。
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就可以智能的进入最新的类做测试了。