NUnit支持将测试结果保存为xml文件,于是就产生了针对其文件产生报表的一些工具。目前普遍为人所接受的转报表工具是NUnit2Report task,这个开源组件是和NAnt集成的,你要把他跑起来得用NAnt以及相应的配置文件,这种设计的出发点是基于NAnt的自动构建,生成相应的报表。
很多像我一样的windows程序员,习惯了集成,习惯于一个工具撒都搞定,不是很有耐心去配置相应的东西,我们希望我跑完一个测试就可以得到报表,用来分析,存档和共享。既然这样,我们就把NUnit2Report整合到我们的NUnit里去吧^_^ !
感谢开源,很轻松地得到了NUnit2Report的dll,源码和相关文档。一开始,我一看是个dll,sdk里又有介绍,就直接拿来用了,由于是为Nant设计的,所以还必须添加nant.core.dll的引用。里面就一个类NUnit2ReportTask,我设置了输入用的NUnit测试结果文件TestResults.xml,就运行Execute,程序报错,说Nant.core里面出错,晕,我又把很多Nant.*文件引用进来,还是报错。
没办法了,我还是直接用源文件吧,看看哪里出错了。由于NP是为Nant设计的,因此NUnit2ReportTask这个类派生于Task,通过覆写成员函数实现自定义操作,我看了些Task类的Excecute方法的源码,发现原先报出的异常应该与Nant里的一些成员变量有关,而且里面只是些异常捕捉和事件处理,没有太特别的地方,于是就把NUnit2ReportTask里面真正工作的ExecuteTask()方法提取出来,作为公共方法进行调用,然后也把初始化方法也在这里面调用,经过几次尝试,终于可以输出报表了!
就这样整合进去也不是很爽,NAnt没什么用还得带着它,于是我又对代码进行了一番改造,去”NAnt”化!把相关的派生和类型都进行了替换,使其与Nant毫无关系^_^。改造后的源码后面会一并放出。
NP改造完成了,就该整合到NUnit中了,我们在NUnit的Tools菜单下加了一个菜单 :
然后把改造后的NP源文件放入Nuit.gui的项目中,添加事件处理函数,内部代码如下:
string fileName = Path.Combine(new FileInfo(this._testLoader.TestFileName).Directory.FullName,"TestResult.xml");
XmlResultVisitor resultVisitor = new XmlResultVisitor( fileName, result);
result.Accept(resultVisitor);
resultVisitor.Write();
NUnit2Report report = new NUnit2Report();
report.NUnitResultXml = fileName;
report.Todir = new FileInfo(this._testLoader.TestFileName).Directory.FullName;
report.OutFilename = string.Format("{0}.html",result.Name);
report.HasFormat = true;
report.BuildReport();
System.Diagnostics.Process.Start(Path.Combine(report.Todir,report.OutFilename));
在上面这段代码中,我们先用nunit自带的功能生成了一个测试结果的xml文件,然后将其作为参数输入NP中,将html报表输出到被测dll的目录下,并以其测试名称命名文件,自动打开此文件。
运行一个测试,点击菜单按钮,浏览器中效果如下:
经过努力,Nunit终于可以自动生成报表了,看到我的Nunit越来越强大,内心真是喜悦啊^_^。
在后面的文章中,我会为Nunit添加更加强大的功能。