NUnit之Attribue详解

系统 1901 0

在上一篇文章“ NUnit之Assertion详解 ”中,给大家介绍了NUnit的断言,现在接着给大家介绍Attribute在NUnit中的具体作用。

Attribute是C#一个重要的语言特征,园子里应该有不少这方面的文章,如果对Attribute不太了解,建议先去稍稍了解一下,亲手做个小程序感受一下Attribute的作用。

我们在使用NUnit编写测试用例时,离不开两个最基本的Attribute,例如,我们要测试一个类的Add方法,使用的代码如下:

      [TestFixture]
      
public class MyTest
{
[Test]
public void TestAdd()
{
int a = 99 ;
int b = 1 ;
int value = MyMath.Add(a,b);
Assert.AreEqual(value, 100 );
}

Public void TestDel()
{
int value = MyMath.del( 99 , 1 );
Assert.AreEqual(value, 98 );
}
}

上面的代码中,已经使用了两个Attribute,即[TestFixture]和[Test],其中[TestFixture]的作用是声明MyTest类是一个含有测试方法的类,而[Test]则说明TestAdd是一个测试方法,而TestDel由于没有用[Test]声明,所以它 不是 测试方法,虽然它以Test开头。

对于编译后的Assembly文件,NUnit就是通过查找[TestFixture]和[Test]这类它支持的与测试相关的Attribute来确定哪些类包含了测试方法,以及这些类中的哪些方法是测试方法。

对于上面的例子,如果用NUnit的图形化界面打开其编译后的Assembly,应该看到如下的界面,TedtAdd方法以及它所属的命名空间按照树的形式展开,而TestDel方法由于没有[Test]的声明,所以它只是一个普通的方法,也就没有在树中展现:

NUnit之Attribue详解_第1张图片

点击Run按钮后,NUnit会运行所有的测试方法,运行后的界面如下

NUnit之Attribue详解_第2张图片

通过上面的小例子,我们知道了[TestFixture]和[Test]这两个Attribute的作用,对它支持的Attribute有了初步了解。

如果查看NUnit的源代码(大家可以去官网注册然后下载),可以知道,在NUnit.Framework这个命名空间中,有TestFixtureAttribute和TestAttribute两个类,它们负责解析带有[TestFixture]和[Test]声明的类和方法(在C#语法规范中,要实现一个名称为[ABC]的Attribute,必须建立名称为ABCAttribute的类,并继承于Attribute这个基类)。

NUnit支持的Attribute远不止上面两个,我大致把它们分为四大类,分别是控制类、数值类、平台类和其它类,下面逐一介绍

 

一:控制类

这些Attribute控制测试类或者测试方法,而且成对出现,功能基本相比,了解一个就自然了解另外一个。

[TestFixture]/[Explicit]:声明一个类是测试类/声明一个类只有在UI界面被选中时才执行

[TestFixtureSetup]/[TestFixtureTearDown]:在测试开始前/结束后要执行的操作,一个TestFixture只能有一个TestFixtureSetup或TestFixtureTearDown。

[Test]/[Ignore]:是测试方法/忽略掉,测试时不执行

[Setup]/[TearDown]:每个测试方法在执行前/结束后要执行的操作

 

二:数值类

数值类Attribue是NUnit的一大亮点,善于使用这些Attribue,将使测试方法变得清晰、简洁、可读性强、可扩展性强,有利于进行数据驱动下的测试。

为了说明下面的例子,使用下面的方法,也就是打印输出输入值及其数据类型,这样便于把执行的结果通过打印的方式在NUnit中输出

      Console.WriteLine(t + 
      
        "
      
      
        , its type:
      
      
        "
      
       + 
      
        typeof
      
      (T));
    

 

[Values]: 以参数的形式传入一组值,NUnit会把这组值分解成相应数量的子测试。

例如下面的代码,分别在[Values]中传入三组共8个值,在执行时便一共会分解成8个子测试方法,例如

      TestPrintInt([
      
        Values
      
      (
      
        1
      
      , 
      
        2
      
      , 
      
        3
      
      )] 
      
        int
      
       x)会被分解为
      
TestPrintInt( 1 )
TestPrintInt( 2 )
TestPrintInt( 3 )三组

如下图,当选中ValueDemo这个节点,然后点击Run按钮后,会看到一共测试了8个测试用例。

NUnit之Attribue详解_第3张图片

当了解了这个Attribue的设计思路后,以后的其它Attribute也就很容易理解了,往往通过它们的命名就可以猜出一二。

 

[ValueSource]: 以数据源(Object类型)作为参数,如下图,左边是源程序,右边是编译后生成的子测试

NUnit之Attribue详解_第4张图片

 

[Combinatorial]: 两组测试数据进行组合,下面的代码会生成12个子测试,如图

NUnit之Attribue详解_第5张图片

 

[Sequential] :和上面[ Combinatorial ]的类似,不同之处见下图

NUnit之Attribue详解_第6张图片

 

下面其它的Attribue也都大同小异,不愿意看文字说明的话,大家用NUnit运行一下示例程序,再对比一下源程序就知道了

[Range] :生成某个数据范围内的子测试,如

      TestPrintColsole([
      
        Range
      
      (
      
        0.2
      
      , 
      
        0.6
      
      , 
      
        0.2
      
      )] 
      
        double
      
       d):生成0.
      
        2
      
      ,
      
        0.4
      
      ,
      
        0
      
      .6三个子测试用例
      

TestPrintColsole([ Values ( 1 , 2 , 3 , 4 , 5 , 6 )] int x, [ Range ( 0.2 , 0.6 , 0.2 )] double d):两个Attribuee结合,共生成18个子测试用例

  [Random] :在某个范围内随机生成测试用例,

      TestPrintColsole([
      
        Random
      
      (-
      
        1.0
      
      , 
      
        1.0
      
      , 
      
        5
      
      )] 
      
        double
      
       d):-1到1之间生成5个测试用例
      

TestPrintColsole([Values( 1 , 2 , 3 , 4 , 5 , 6 )] int x, [Random(- 1.0 , 1.0 , 5 )] double d) :共生成30个子测试用例

 

三:平台类

[Culture] :当Culture满足某条件下,才执行测试,如:

      [
      
        Culture
      
      (
      
        "
      
      
        fr-FR
      
      
        "
      
      )]:仅当在法文Culture时,执行测试
      

[ Culture (Exclude = " en,de " )]:非英文和德文Culture时,才执行测试

[Platform] :当Platform满足某条件下,才执行测试,如:

      [
      
        Platform
      
      (
      
        "
      
      
        NET-4.0
      
      
        "
      
      )]:仅当framework版本是4.0时,才执行测试
    


下面是NUnit官网声称的,其支持的平台类型:

Win Win32 Win32S Windows Win32NT
WinCE Win95 Win98 WinMe NT3
NT4 NT5 NT6 Win2K WinXP
Win2003Server Vista Win2008Server Win2008ServerR2 Windows7
Unix Linux Net Net-1.0 Net-1.1
Net-2.0 Net-3.0 Net-3.5 Net-4.0 NetCF
SSCLI Rotor Mono Mono-1.0 Mono-2.0
Mono-3.0 Mono-3.5      

四:其它类

[Category] :将测试方法分组,NUnit会取出所有的组名,列在Categories中,点击它可以看到。这提供了另外一种测试用例的运行方法,用户可以在些选择某一类的用例进行测试,而不是只能以点击分单位

[ExpectedException] :运行时抛出的异常才能预期的行为。

如果没有这个Attribute,要测试某些异常时, 只能使用Try Catch的方式,而下面的代码则更为简洁:

      [Test]
      
[ ExpectedException ( typeof (System.DivideByZeroException))]//发生DivideByZeroException时,测试通过
public void Test1()
{
int a = 0 ;
int b = 1 / a;
PrintConsole< object >.Print(b);
}

[Test]
[ ExpectedException ( " System.DivideByZeroException " )]//发生DivideByZeroException时,测试通过
      
        public
      
      
        void
      
       Test2()
      
{
int a = 0 ;
int b = 1 / a;
PrintConsole< object >.Print(b);
}

[Maxtime]/ [Timeout] : 测试用例的最大执行时间,前者超时时不取消测试,而后者会强行中断,用法如下

      [Test, 
      
        Maxtime
      
      (
      
        2000
      
      )]
      

[Test, Timeout ( 2000 )]

[Repeat] : 重复执行多少次,用法如下

      [Test, 
      
        Repeat
      
      (
      
        100
      
      )]
    

[RequiresMTA]/ [RequiresSTA]/ [RequiresThread] :测试用例必须的在多线程、单线程、独立的线程状态下运行,这三个我没有具体使用过,大家有兴起可以试试。

 

关于NUnit的Attribue就介绍这些,建议对此有兴起的网友,多关注其中数值类和平台类,或是修改NUnit的源代码,实现自己的Attribute,下文会有所介绍。

点此 下载 VS2010格式的 示例程序,解压缩的DLL目录下有NUnit库,引用该库即可以运行。

NUnit之Attribue详解


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论