欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

NUnit之Attribue詳解

系統(tǒng) 2185 0

在上一篇文章“ NUnit之Assertion詳解 ”中,給大家介紹了NUnit的斷言,現(xiàn)在接著給大家介紹Attribute在NUnit中的具體作用。

Attribute是C#一個重要的語言特征,園子里應(yīng)該有不少這方面的文章,如果對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 );
}
}

上面的代碼中,已經(jīng)使用了兩個Attribute,即[TestFixture]和[Test],其中[TestFixture]的作用是聲明MyTest類是一個含有測試方法的類,而[Test]則說明TestAdd是一個測試方法,而TestDel由于沒有用[Test]聲明,所以它 不是 測試方法,雖然它以Test開頭。

對于編譯后的Assembly文件,NUnit就是通過查找[TestFixture]和[Test]這類它支持的與測試相關(guān)的Attribute來確定哪些類包含了測試方法,以及這些類中的哪些方法是測試方法。

對于上面的例子,如果用NUnit的圖形化界面打開其編譯后的Assembly,應(yīng)該看到如下的界面,TedtAdd方法以及它所屬的命名空間按照樹的形式展開,而TestDel方法由于沒有[Test]的聲明,所以它只是一個普通的方法,也就沒有在樹中展現(xiàn):

NUnit之Attribue詳解_第1張圖片

點擊Run按鈕后,NUnit會運行所有的測試方法,運行后的界面如下

NUnit之Attribue詳解_第2張圖片

通過上面的小例子,我們知道了[TestFixture]和[Test]這兩個Attribute的作用,對它支持的Attribute有了初步了解。

如果查看NUnit的源代碼(大家可以去官網(wǎng)注冊然后下載),可以知道,在NUnit.Framework這個命名空間中,有TestFixtureAttribute和TestAttribute兩個類,它們負(fù)責(zé)解析帶有[TestFixture]和[Test]聲明的類和方法(在C#語法規(guī)范中,要實現(xiàn)一個名稱為[ABC]的Attribute,必須建立名稱為ABCAttribute的類,并繼承于Attribute這個基類)。

NUnit支持的Attribute遠不止上面兩個,我大致把它們分為四大類,分別是控制類、數(shù)值類、平臺類和其它類,下面逐一介紹

?

一:控制類

這些Attribute控制測試類或者測試方法,而且成對出現(xiàn),功能基本相比,了解一個就自然了解另外一個。

[TestFixture]/[Explicit]:聲明一個類是測試類/聲明一個類只有在UI界面被選中時才執(zhí)行

[TestFixtureSetup]/[TestFixtureTearDown]:在測試開始前/結(jié)束后要執(zhí)行的操作,一個TestFixture只能有一個TestFixtureSetup或TestFixtureTearDown。

[Test]/[Ignore]:是測試方法/忽略掉,測試時不執(zhí)行

[Setup]/[TearDown]:每個測試方法在執(zhí)行前/結(jié)束后要執(zhí)行的操作

?

二:數(shù)值類

數(shù)值類Attribue是NUnit的一大亮點,善于使用這些Attribue,將使測試方法變得清晰、簡潔、可讀性強、可擴展性強,有利于進行數(shù)據(jù)驅(qū)動下的測試。

為了說明下面的例子,使用下面的方法,也就是打印輸出輸入值及其數(shù)據(jù)類型,這樣便于把執(zhí)行的結(jié)果通過打印的方式在NUnit中輸出

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

?

[Values]: 以參數(shù)的形式傳入一組值,NUnit會把這組值分解成相應(yīng)數(shù)量的子測試。

例如下面的代碼,分別在[Values]中傳入三組共8個值,在執(zhí)行時便一共會分解成8個子測試方法,例如

      TestPrintInt([
      
        Values
      
      (
      
        1
      
      , 
      
        2
      
      , 
      
        3
      
      )] 
      
        int
      
       x)會被分解為
      
TestPrintInt( 1 )
TestPrintInt( 2 )
TestPrintInt( 3 )三組

如下圖,當(dāng)選中ValueDemo這個節(jié)點,然后點擊Run按鈕后,會看到一共測試了8個測試用例。

NUnit之Attribue詳解_第3張圖片

當(dāng)了解了這個Attribue的設(shè)計思路后,以后的其它Attribute也就很容易理解了,往往通過它們的命名就可以猜出一二。

?

[ValueSource]: 以數(shù)據(jù)源(Object類型)作為參數(shù),如下圖,左邊是源程序,右邊是編譯后生成的子測試

NUnit之Attribue詳解_第4張圖片

?

[Combinatorial]: 兩組測試數(shù)據(jù)進行組合,下面的代碼會生成12個子測試,如圖

NUnit之Attribue詳解_第5張圖片

?

[Sequential] :和上面[ Combinatorial ]的類似,不同之處見下圖

NUnit之Attribue詳解_第6張圖片

?

下面其它的Attribue也都大同小異,不愿意看文字說明的話,大家用NUnit運行一下示例程序,再對比一下源程序就知道了

[Range] :生成某個數(shù)據(jù)范圍內(nèi)的子測試,如

      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結(jié)合,共生成18個子測試用例

? [Random] :在某個范圍內(nèi)隨機生成測試用例,

      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] :當(dāng)Culture滿足某條件下,才執(zhí)行測試,如:

      [
      
        Culture
      
      (
      
        "
      
      
        fr-FR
      
      
        "
      
      )]:僅當(dāng)在法文Culture時,執(zhí)行測試
      

[ Culture (Exclude = " en,de " )]:非英文和德文Culture時,才執(zhí)行測試

[Platform] :當(dāng)Platform滿足某條件下,才執(zhí)行測試,如:

      [
      
        Platform
      
      (
      
        "
      
      
        NET-4.0
      
      
        "
      
      )]:僅當(dāng)framework版本是4.0時,才執(zhí)行測試
    


下面是NUnit官網(wǎng)聲稱的,其支持的平臺類型:

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] :運行時拋出的異常才能預(yù)期的行為。

如果沒有這個Attribute,要測試某些異常時, 只能使用Try Catch的方式,而下面的代碼則更為簡潔:

      [Test]
      
[ ExpectedException ( typeof (System.DivideByZeroException))]//發(fā)生DivideByZeroException時,測試通過
public void Test1()
{
int a = 0 ;
int b = 1 / a;
PrintConsole< object >.Print(b);
}

[Test]
[ ExpectedException ( " System.DivideByZeroException " )]//發(fā)生DivideByZeroException時,測試通過
      
        public
      
      
        void
      
       Test2()
      
{
int a = 0 ;
int b = 1 / a;
PrintConsole< object >.Print(b);
}

[Maxtime]/ [Timeout] : 測試用例的最大執(zhí)行時間,前者超時時不取消測試,而后者會強行中斷,用法如下

      [Test, 
      
        Maxtime
      
      (
      
        2000
      
      )]
      

[Test, Timeout ( 2000 )]

[Repeat] : 重復(fù)執(zhí)行多少次,用法如下

      [Test, 
      
        Repeat
      
      (
      
        100
      
      )]
    

[RequiresMTA]/ [RequiresSTA]/ [RequiresThread] :測試用例必須的在多線程、單線程、獨立的線程狀態(tài)下運行,這三個我沒有具體使用過,大家有興起可以試試。

?

關(guān)于NUnit的Attribue就介紹這些,建議對此有興起的網(wǎng)友,多關(guān)注其中數(shù)值類和平臺類,或是修改NUnit的源代碼,實現(xiàn)自己的Attribute,下文會有所介紹。

點此 下載 VS2010格式的 示例程序,解壓縮的DLL目錄下有NUnit庫,引用該庫即可以運行。

NUnit之Attribue詳解


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 丝袜 亚洲 另类 欧美 变态 | 一级毛片免费看 | 精品视频在线免费播放 | 青草国产超碰人人添人人碱 | 日韩版码免费福利视频 | 福利精品| 日韩影院在线观看 | 邪不压正免费观看完整高清视频 | 国产福利在线永久视频 | 久久婷婷色香五月综合激情 | 久久久久99 | 色www精品视频在线观看 | 欧美国产二区 | 不卡国产一区二区三区四区 | 国产精品极品美女自在线看免费一区二区 | 九九久久精品 | 蜜桃传媒一区二区亚洲AV | jizjizjiz中国护士18 | 草草影院国产第一页 | 久久爱伊人 | 一级毛片欧美 | 国产精品三级a三级三级午夜 | 日本老妇乱子伦中文视频 | 黄工厂精品视频在线观看 | 一区二区三区高清视频在线观看 | 亚洲嗯啊 | 午夜不卡一区二区 | 公么吃奶满足了我苏媚 | 我不卡午夜 | 中文字幕亚洲图片 | 久久男人| 四虎1515hh精品影库 | 天堂在线免费视频 | 欧美日韩精品一区二区三区在线观看 | 天天干天天操天天碰 | 99r精品在线 | 99动漫 | 天天操91| 免费国产一区二区三区 | 成人资源在线观看 | 国产一级毛片夜一级毛片 |