1。待测系统(SUT) using System;namespace Mathlib...{ public class Methods ...{ public static int MethodSum(params int[] vals) ...{ int sum=0; if (vals == null) return 0; for(int i=0;i<vals.Length;i++) sum+=vals[i]; return sum; } public static double MethodAverage(params int[] vals) ...{ double average=0.0; int sum=0; for(int i=0;i<vals.Length;i++) sum+=vals[i]; average=sum/vals.Length; return average; } }} 2。Program Apitest using System;using Mathlib;using System.IO;using System.Net.Mail;namespace TestAutomation...{ /**//// <summary> /// Description of APITest. /// </summary> public class APITest ...{ static void Main(string[] args) ...{ try ...{ //读取Testcases FileStream fs=new FileStream("../../Test data and result/Testcases.txt",FileMode.Open);// string testCasesFile=args[0];// FileStream fs=new FileStream(testCasesFile,FileMode.Open);//文件名与路径参数化 StreamReader sr=new StreamReader(fs); //创建一个以时间戳命名的文件夹,保存results string folder="Result"+DateTime.Now.ToString("s"); folder=folder.Replace(":","-"); Directory.CreateDirectory("../../Test data and result/"+folder); string path="../../Test data and result/"+folder+"/TestResults.txt"; FileStream ofs=new FileStream(path,FileMode.CreateNew); StreamWriter sw=new StreamWriter(ofs); string line, caseID, method; string[] tokens,tempInput; int[] input=null; string expected; int actual1=0; double actual2=0.0; int numPass=0,numFail=0,numCases=0; DateTime startTime=DateTime.Now;//记录开始时间 Console.WriteLine(" CaseID Result Method Details"); Console.WriteLine("============================ "); while((line=sr.ReadLine())!=null) ...{ tokens=line.Split(':'); caseID=tokens[0]; method=tokens[1]; if(tokens[2]=="NULL") //输入为NULL的处理方法 input=null; else ...{ tempInput=tokens[2].Split(' '); input=new int[tempInput.Length]; for(int i=0;i<input.Length;i++) input[i]=int.Parse(tempInput[i]); } expected=tokens[3]; if(method=="MethodSum") ...{ actual1=Mathlib.Methods.MethodSum(input); if(actual1==int.Parse(expected)) ...{ Console.WriteLine(caseID+" Pass "+method+" actual= "+actual1.ToString()); sw.WriteLine(caseID+" Pass "+method+" actual= "+actual1.ToString()); ++numPass; ++numCases; } else ...{ Console.WriteLine(caseID+" *FAIL* "+method+" actual= "+actual1.ToString()); sw.WriteLine(caseID+" *FAIL* "+method+" actual= "+actual1.ToString()); ++numFail; ++numCases; } } else if(method=="MethodAverage") ...{ actual2=Mathlib.Methods.MethodAverage(input); if(actual2==double.Parse(expected)) ...{ Console.WriteLine(caseID+" Pass "+method+" actual= "+actual2.ToString()); sw.WriteLine(caseID+" Pass "+method+" actual= "+actual2.ToString()); ++numPass; ++numCases; } else if(tokens[3]=="Exception") ...{ Console.WriteLine(caseID+" *Fail* "+method+" actual= "+actual2.ToString()); sw.WriteLine(caseID+" *Fail* "+method+" actual= "+actual2.ToString()); ++numFail; ++numCases; } } else ...{ Console.WriteLine(caseID+" "+method+" Not yet implemented"); sw.WriteLine(caseID+" "+method+" Not yet implemented"); } if((numPass+numFail)!=numCases) Console.WriteLine("Warning:Counter logic failure"); } Console.WriteLine(" ======== end test run ========"); Console.WriteLine(" Pass = "+numPass+" Fail = "+numFail); DateTime endTime= DateTime.Now;//记录结束时间 TimeSpan elapsedTime = endTime-startTime;//计算用时 sw.WriteLine(Environment.NewLine+"Number cases passed="+numPass); sw.WriteLine("Number cases failed="+numFail); sw.WriteLine("Total cases="+(numPass+numFail)); double percent=((double)numPass)/(numPass+numFail); sw.WriteLine("Percent passed="+percent.ToString("P")); sw.WriteLine("Elapsed Time="+elapsedTime.ToString()); sr.Close(); fs.Close(); sw.Close(); ofs.Close(); } catch(Exception e) ...{ Console.WriteLine("Fatal error: "+e.Message); } Console.ReadLine(); }//Main }//Class class()}//TestAutomation 问题: 1。文件路径参数化 2。处理“方法抛出异常”的情况 3。在Apitest中在测试用例失败时发送警告邮件