在NANT使用Nunit2标签运行Nunit测试

在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,而且帮助我抓到了之前遗漏的东西,你也可以试试。

你可能感兴趣的:(ant)