在上一篇文章“ NUnit之Assertion詳解 ”中,給大家介紹了NUnit的斷言,現(xiàn)在接著給大家介紹Attribute在NUnit中的具體作用。
Attribute是C#一個(gè)重要的語言特征,園子里應(yīng)該有不少這方面的文章,如果對Attribute不太了解,建議先去稍稍了解一下,親手做個(gè)小程序感受一下Attribute的作用。
我們在使用NUnit編寫測試用例時(shí),離不開兩個(gè)最基本的Attribute,例如,我們要測試一個(gè)類的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)使用了兩個(gè)Attribute,即[TestFixture]和[Test],其中[TestFixture]的作用是聲明MyTest類是一個(gè)含有測試方法的類,而[Test]則說明TestAdd是一個(gè)測試方法,而TestDel由于沒有用[Test]聲明,所以它 不是 測試方法,雖然它以Test開頭。
對于編譯后的Assembly文件,NUnit就是通過查找[TestFixture]和[Test]這類它支持的與測試相關(guān)的Attribute來確定哪些類包含了測試方法,以及這些類中的哪些方法是測試方法。
對于上面的例子,如果用NUnit的圖形化界面打開其編譯后的Assembly,應(yīng)該看到如下的界面,TedtAdd方法以及它所屬的命名空間按照樹的形式展開,而TestDel方法由于沒有[Test]的聲明,所以它只是一個(gè)普通的方法,也就沒有在樹中展現(xiàn):
點(diǎn)擊Run按鈕后,NUnit會(huì)運(yùn)行所有的測試方法,運(yùn)行后的界面如下
通過上面的小例子,我們知道了[TestFixture]和[Test]這兩個(gè)Attribute的作用,對它支持的Attribute有了初步了解。
如果查看NUnit的源代碼(大家可以去官網(wǎng)注冊然后下載),可以知道,在NUnit.Framework這個(gè)命名空間中,有TestFixtureAttribute和TestAttribute兩個(gè)類,它們負(fù)責(zé)解析帶有[TestFixture]和[Test]聲明的類和方法(在C#語法規(guī)范中,要實(shí)現(xiàn)一個(gè)名稱為[ABC]的Attribute,必須建立名稱為ABCAttribute的類,并繼承于Attribute這個(gè)基類)。
NUnit支持的Attribute遠(yuǎn)不止上面兩個(gè),我大致把它們分為四大類,分別是控制類、數(shù)值類、平臺(tái)類和其它類,下面逐一介紹
?
一:控制類
這些Attribute控制測試類或者測試方法,而且成對出現(xiàn),功能基本相比,了解一個(gè)就自然了解另外一個(gè)。
[TestFixture]/[Explicit]:聲明一個(gè)類是測試類/聲明一個(gè)類只有在UI界面被選中時(shí)才執(zhí)行
[TestFixtureSetup]/[TestFixtureTearDown]:在測試開始前/結(jié)束后要執(zhí)行的操作,一個(gè)TestFixture只能有一個(gè)TestFixtureSetup或TestFixtureTearDown。
[Test]/[Ignore]:是測試方法/忽略掉,測試時(shí)不執(zhí)行
[Setup]/[TearDown]:每個(gè)測試方法在執(zhí)行前/結(jié)束后要執(zhí)行的操作
?
二:數(shù)值類
數(shù)值類Attribue是NUnit的一大亮點(diǎn),善于使用這些Attribue,將使測試方法變得清晰、簡潔、可讀性強(qiáng)、可擴(kuò)展性強(qiáng),有利于進(jìn)行數(shù)據(jù)驅(qū)動(dòng)下的測試。
為了說明下面的例子,使用下面的方法,也就是打印輸出輸入值及其數(shù)據(jù)類型,這樣便于把執(zhí)行的結(jié)果通過打印的方式在NUnit中輸出
Console.WriteLine(t +
"
, its type:
"
+
typeof
(T));
?
[Values]: 以參數(shù)的形式傳入一組值,NUnit會(huì)把這組值分解成相應(yīng)數(shù)量的子測試。
例如下面的代碼,分別在[Values]中傳入三組共8個(gè)值,在執(zhí)行時(shí)便一共會(huì)分解成8個(gè)子測試方法,例如
TestPrintInt([
Values
(
1
,
2
,
3
)]
int
x)會(huì)被分解為
TestPrintInt(
1
)
TestPrintInt(
2
)
TestPrintInt(
3
)三組
如下圖,當(dāng)選中ValueDemo這個(gè)節(jié)點(diǎn),然后點(diǎn)擊Run按鈕后,會(huì)看到一共測試了8個(gè)測試用例。
當(dāng)了解了這個(gè)Attribue的設(shè)計(jì)思路后,以后的其它Attribute也就很容易理解了,往往通過它們的命名就可以猜出一二。
?
[ValueSource]: 以數(shù)據(jù)源(Object類型)作為參數(shù),如下圖,左邊是源程序,右邊是編譯后生成的子測試
?
[Combinatorial]: 兩組測試數(shù)據(jù)進(jìn)行組合,下面的代碼會(huì)生成12個(gè)子測試,如圖
?
[Sequential] :和上面[ Combinatorial ]的類似,不同之處見下圖
?
下面其它的Attribue也都大同小異,不愿意看文字說明的話,大家用NUnit運(yùn)行一下示例程序,再對比一下源程序就知道了
[Range] :生成某個(gè)數(shù)據(jù)范圍內(nèi)的子測試,如
TestPrintColsole([
Range
(
0.2
,
0.6
,
0.2
)]
double
d):生成0.
2
,
0.4
,
0
.6三個(gè)子測試用例
TestPrintColsole([
Values
(
1
,
2
,
3
,
4
,
5
,
6
)]
int
x, [
Range
(
0.2
,
0.6
,
0.2
)]
double
d):兩個(gè)Attribuee結(jié)合,共生成18個(gè)子測試用例
? [Random] :在某個(gè)范圍內(nèi)隨機(jī)生成測試用例,
TestPrintColsole([
Random
(-
1.0
,
1.0
,
5
)]
double
d):-1到1之間生成5個(gè)測試用例
TestPrintColsole([Values(
1
,
2
,
3
,
4
,
5
,
6
)]
int
x, [Random(-
1.0
,
1.0
,
5
)]
double
d) :共生成30個(gè)子測試用例
?
三:平臺(tái)類
[Culture] :當(dāng)Culture滿足某條件下,才執(zhí)行測試,如:
[
Culture
(
"
fr-FR
"
)]:僅當(dāng)在法文Culture時(shí),執(zhí)行測試
[
Culture
(Exclude =
"
en,de
"
)]:非英文和德文Culture時(shí),才執(zhí)行測試
[Platform] :當(dāng)Platform滿足某條件下,才執(zhí)行測試,如:
[
Platform
(
"
NET-4.0
"
)]:僅當(dāng)framework版本是4.0時(shí),才執(zhí)行測試
下面是NUnit官網(wǎng)聲稱的,其支持的平臺(tái)類型:
| 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會(huì)取出所有的組名,列在Categories中,點(diǎn)擊它可以看到。這提供了另外一種測試用例的運(yùn)行方法,用戶可以在些選擇某一類的用例進(jìn)行測試,而不是只能以點(diǎn)擊分單位
[ExpectedException] :運(yùn)行時(shí)拋出的異常才能預(yù)期的行為。
如果沒有這個(gè)Attribute,要測試某些異常時(shí), 只能使用Try Catch的方式,而下面的代碼則更為簡潔:
[Test]
[
ExpectedException
(
typeof
(System.DivideByZeroException))]//發(fā)生DivideByZeroException時(shí),測試通過
public
void
Test1()
{
int
a =
0
;
int
b =
1
/ a;
PrintConsole<
object
>.Print(b);
}
[Test]
[
ExpectedException
(
"
System.DivideByZeroException
"
)]//發(fā)生DivideByZeroException時(shí),測試通過
public
void
Test2()
{
int
a =
0
;
int
b =
1
/ a;
PrintConsole<
object
>.Print(b);
}
[Maxtime]/ [Timeout] : 測試用例的最大執(zhí)行時(shí)間,前者超時(shí)時(shí)不取消測試,而后者會(huì)強(qiáng)行中斷,用法如下
[Test,
Maxtime
(
2000
)]
[Test,
Timeout
(
2000
)]
[Repeat] : 重復(fù)執(zhí)行多少次,用法如下
[Test,
Repeat
(
100
)]
[RequiresMTA]/ [RequiresSTA]/ [RequiresThread] :測試用例必須的在多線程、單線程、獨(dú)立的線程狀態(tài)下運(yùn)行,這三個(gè)我沒有具體使用過,大家有興起可以試試。
?
關(guān)于NUnit的Attribue就介紹這些,建議對此有興起的網(wǎng)友,多關(guān)注其中數(shù)值類和平臺(tái)類,或是修改NUnit的源代碼,實(shí)現(xiàn)自己的Attribute,下文會(huì)有所介紹。
點(diǎn)此 下載 VS2010格式的 示例程序,解壓縮的DLL目錄下有NUnit庫,引用該庫即可以運(yùn)行。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

