TDD(Test-Driven Development)
測試驅動開發,就是以測試用例來帶動開發,也就是先作測試用例,而後根據測試用例作開發。TDD
的好外使是開發人員能夠針對性的作開發,目標就是經過測試用例,固然,TDD
更適合作邏輯的程序員,不適合更多的與UI
開發相關的程序員。
無論是TDD
也好,傳統的開發也好,確定要先作設計,設計展開後若是採用普通方法作開發,那就是開始寫代碼,而後單元測試,集成測試等工做。若是用TDD
,那就要先從設計中把測試列表(其實就是要實現的功能,人機交互的條目羅列出來,造成一個列表)整理出來。而後就開始開發,在TDD
中,「紅-
綠-
重構」的過程不少說明TDD
的文章都要說到,本篇也不例外。
有了測試列後,先拿出一個條目,進行測試的開發,開發完成運行,由於被測的程序尚未編寫確定是失敗的,而後實現程序,再測,可能還失敗,改爲,測試成功,而後重構來優化代碼,再進入下一個測試條目的循環。
在.net
平臺下,怎麼去實現呢?
本例中用VS2010
行進說明,設計部分,能夠用vs2010
的新功能Modeling
,在Modeling
裏,能夠畫類圖,還能夠添加其中的成員,包括返回值類型,參數個數和類型,有了這些方法的簽名,對咱們先構建測試就提供了依據,對測試程序來講,不關心實現的細節,只用知道參數是什麼,返回是什麼,拿上這個方法的返回值與給定的返回值做對比,從而來肯定方法實現的功能是否正確。在Visual Studio
中,能夠很方便的來自動建立單元測試,這些方便要歸功於「反射」這個技術。固然,通常而然,測試不是隻有一個數據,可能要一系列數據,或者更多的數據,在.net
平臺下,也提供了相應的功能。
下面來作個DEMO
說明一下。
先看一個類圖,也能夠把類中的主要功能,當成一個個條目添加到測試列表中。
咱們選一個條目——
GetRecord
,參數是一個
ID
的整型,返回值是一個邏輯類型,本方法用來實如今一個庫中查詢輸入的
ID
,看是否存在。
根據類圖,能夠在類庫項目中生成一個類,以下
1
public
class
DataOperate
2
{
3
public
bool
GetRecord(
int
id)
4
{
5
throw
new
Exception(
"
沒有實Ì現?
"
);
6
}
7
}
8
接下來,能夠繼於這個方法,來自動建立一個單元測試,右鍵方法,建立測試。
一個測試的項目就會自動建立進來,在生成的CS
文件中,重點看以下代碼(關於單元測試的其餘知識可參照http://msdn.microsoft.com/zh-cn/library/ms182515(VS.80).aspx
)
1
[TestMethod()]
2
public
void
GetRecordTest()
3
{
4
DataOperate target
=
new
DataOperate();
5
int
id
=
0
;
6
bool
expected
=
false
;
7
bool
actual;
8
actual
=
target.GetRecord(id);
9
Assert.AreEqual(expected, actual);
10
}
11
在這裏,測試的用例只有一個id=0
,返回值爲false
,如今測試,確定通不過,由於被測的方法尚未實現。此時叫作「紅」。
接下來就要實現GetRecord
方法。
新建一個類庫項目,而後添加一個LINQ To SQL
的子項,把下表拖放進LINQ To SQL
面板。
數據表結構
數據表中數據
而後在類庫的
CS
文件中,添加入下代碼:
1
public
bool
GetRecord(
int
id)
2
{
3
DataClasses1DataContext DCDC
=
new
DataClasses1DataContext(
"
server=.;database=mytestdb;uid=sa;pwd=sa;
"
);
4
if
(DCDC.GetTable
<
Pic_Table
>
().Where(record
=>
record.ID
==
id).Count()
==
1
)
5
{
6
return
true
;
7
}
8
else
9
{
10
return
false
;
11
}
12
}
13
固然測試是不關心咱們用什麼技術實現方法的,它只關係輸入和輸出。
這時咱們再運行測試,會發現測試經過了,這時咱們叫作「綠」。
可能有的人發現,在這個測試中,只能測一個數據,沒有表明性,若是要測多個數據,還得一個一個換id
值和expected
值。是的,這是一個頭痛的事,得想們辦法來解決。
正好,微軟有提供數據驅動的單元測試,什麼意思呢?就是能夠把id
和expected
的值保存在數據源中,而後批量測試。若是全經過說明這個方法實現的沒問題,若是有錯,也能夠針對性的能找出什麼數據使GetRecord
方法報錯的。這個東西很不錯。
首先來構建一個數據源,
XML
是個不錯的選擇,新建一個
RecordExistTestCase.xml
文檔,內容以下
1
<?
xml version="1.0" encoding="utf-8"
?>
2
<
DataSourses
>
3
<
pic
>
4
<
id
>
0
</
id
>
5
<
value
>
false
</
value
>
6
</
pic
>
7
<
pic
>
8
<
id
>
-1
</
id
>
9
<
value
>
false
</
value
>
10
</
pic
>
11
<
pic
>
12
<
id
>
1
</
id
>
13
<
value
>
true
</
value
>
14
</
pic
>
15
</
DataSourses
>
16
固然你還能夠添加你覺得好的測試用例。
再改造一下測試方法
1
[DataSource(
"
Microsoft.VisualStudio.TestTools.DataSource.XML
"
,
"
|DataDirectory|\\RecordExistTestCase.xml
"
,
"
pic
"
, DataAccessMethod.Sequential)]
2
[ DeploymentItem(
"
TestDataOperate\\RecordExistTestCase.xml
"
)]
3
[ TestMethod()]
4
public
void
GetRecordTest()
5
{
6
……
7
}
8
OK
,如今就要以用上面xml
裏的數據來批量測試了。
測試經過來,接下來就要程序員來整理一下自寫的代碼了,好比書寫規範問題,方法是否冗餘重複,註釋是否完善等。也就是所說的重構了。
到此,一個TDD cycle
就完成了,現實的cycle
可能更復雜,這裏只是對單個測試條目單個方法進行說明的。
TDD
更適合在敏捷的開發中去用,好比
XP
,雖然
scrum
是側重管理和組織,也能很好的溶入
TDD
。