在NANT使用Nunit2标签运行Nunit测试
起因
项目中一直使用nunit,近期发现利用脚本在运行测试时偶尔出现nunit的socket error,很影响大家的情绪,于是到网上查了一下,没有什么好的解决方法。于是换个思路,看能不能换一种方式运行测试,一般来说,.Net平台下运行Nunit测试有两种方式
- Nunit自带的runner,比如nunit-console-x86.exe,使用命令行运行exe,然后将测试dll作为参数传入
- Nunit2,是Nant引入的新标签,可以脱离nunit的runner单独运行
本文介绍如何使用Nunit2标签运行测试dll。
XML配置文件
根据Nant的帮助文档,我们可以大致了解如何配置nunit2标签,我不得不说nant的帮助文档过于简陋,其中有很多东西都是我读nant源码发现的。配置完的XML如下:
<?xml version="1.0" encoding="utf-8"?> <project name="Test" default="RunUnitTest"> <target name="RunUnitTest" > <nunit2> <formatter type="Xml" usefile="true" extension=".xml"/> <formatter type="Plain" /> <test> <assemblies basedir="bin\Debug"> <include name="*UnitTest.dll" /> </assemblies> </test> </nunit2> </target> </project>
上面的XML中,需要注意的是
- 配置了两个
formatter
,因为plain输出在控制台上,xml则会生成测试报告 <assemblies>
中的basedir是根据该XML文件的相对路径<nunit2>
默认的属性failonerror为true,也就是说当有测试失败时,整个target也会失败- 参考帮助文档,
<nunit2>
中的属性verbose会输出详细信息,我配置了一下却不工作,读了源码后发现代码里根本没有用到
对测试代码的影响
在切换为Nunit2标签后,你需要对你的测试代码进行一些调整
ExpectedException
请看下面的测试
[Test] [ExpectedException(typeof(Exception))] public void should_throw_exception() { throw new Exception(); }
使用Nunit2标签后运行时会报出现Exception,也就是它没有识别出这个测试应该抛出异常。而且我也不建议大家使用[ExpectedException],你可以用换成下面的写法
[Test] public void should_throw_exception() { Assert.Throws<Exception>( () => { throw new Exception(); }); }
这样的好处就是我可以明确知道那一句抛出了异常,而且Nunit2
标签也能识别出来。
ExceptionInDispose
在C#中是可以定义析构函数的,那么下面的测试用nunit-console-x86.exe运行会成功,虽然它会在析构函数中抛出异常。
[Test] public void should_throw_exception() { new C(); } internal class C { ~C(){ throw new Exception(); } }
我认为这是不对的,我加入了析构函数,肯定是需要管理非托管资源,析构阶段也需要关注的。Nunit2标签
帮我抓住了这个问题,它显示测试通过了,但是却因为异常而终止了执行。
效果
切换到Nunit2之后,再也没有看到过nunit的socket error,而且帮助我抓到了之前遗漏的东西,你也可以试试。