zoukankan      html  css  js  c++  java
  • 在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,而且帮助我抓到了之前遗漏的东西,你也可以试试。

  • 相关阅读:
    PHP流程控制考察点
    PHP运算符考察点
    PHP的魔术常量
    android窗体溢出WindowManager$BadTokenException: Unable to add window -- token null is not for an applica
    android网络访问异常java.lang.SecurityException: Permission denied (missing INTERNET permission?)
    快速排序算法思想
    播放Assets下的指定音频时,变成播放所有音频了
    python-01-Python环境搭建
    eclipse安装svn
    DOM children方法
  • 原文地址:https://www.cnblogs.com/iammatthew/p/2556165.html
Copyright © 2011-2022 走看看