范尼是德鲁伊

matthew的技术博客

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

在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中,需要注意的是

  1. 配置了两个formatter,因为plain输出在控制台上,xml则会生成测试报告
  2. <assemblies>中的basedir是根据该XML文件的相对路径
  3. <nunit2>默认的属性failonerror为true,也就是说当有测试失败时,整个target也会失败
  4. 参考帮助文档,<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,而且帮助我抓到了之前遗漏的东西,你也可以试试。

posted on 2012-06-20 14:12  范尼是德鲁伊  阅读(388)  评论(0编辑  收藏  举报