[Enterprise Library]把單元測試代碼跟項目代碼放在一個工程中[轉]


在閱讀 Enterprise Library 代碼的時候,我們可以看到 Enterprise Library 的測試代碼和實現功能代碼是在一個項目中的。這麼做的好處在於:

測試跟實現代碼放在一起,我們就可以測試 internal 的方法函數。
參見對 internal 的定義:
internal 關鍵字是類型和類型成員的訪問修飾符。內部成員只有在同一程序集中的文件內纔是可訪問的。
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/csref/html/vclrfInternalPG.asp

測試代碼和具體實現代碼放在一個項目中,這時候我們就需要區分測試版和運行版,就類似於編譯工程有Debug版和Release版一樣。

下面我們簡單的看看實現自定義區分不同的編譯版本。

首先我們仍然來看 Enterprise Library 的代碼,在它的項目中,我們可以看到,編譯一個項目的時候,有六個編譯選項,而不是以前默認只有的兩個編譯選項,如下圖:
集成到項目中的單元測試01 
對應的編譯出來的版本,就具有或者不具有對應的某一部分功能。
我們如果要作單元測試,只需要編譯出對應的版本既可以,在發佈的時候,發佈一個Release版本,這個版本就會不包含單元測試代碼。


下面我們來看 Enterprise Library 具體如何實現的。

1、首先我們來看如何實現增加這幾個編譯選項。

A、在“解決方案資源管理器”中選中解決方案。
B、在“生成”菜單中選擇“配置管理器”菜單項,這時候會有“配置管理器”窗口出來。
C、打開“活動的解決方案配置”下的下拉列表框,下拉列表項中有一項“新建”,單擊它。如下圖:
集成到項目中的單元測試02 
D、在“新建解決方案配置”窗體中,輸入編譯選項的名稱,同時爲了方便,選擇一個跟這個編譯選項配置比較接近的已有編譯選項。如下圖所示:
集成到項目中的單元測試03 
E、重複C、D操作,把你準備增加的編譯選項都增加上去。
F、對不同的工程項目,也做類似的配置。基本類似,這裏就不重複了。

2、下面我們來配置具體的編譯選項。

A、選中其中一個項目,右鍵單擊選擇屬性。
B、在屬性頁左邊依次選擇“配置屬性”,“生成”。修改這時候右邊 “條件編譯常數” 中的值,比如下圖方式:
集成到項目中的單元測試04 
上圖增加了 UNIT_TESTS 編譯常數。這樣我們在代碼中只要判斷有沒有這個編譯常數,既可以讓他去做一些事情。
如下述代碼:


#if UNIT_TESTS using System.Threading;
using NUnit.Framework;

namespace Microsoft.Practices.EnterpriseLibrary.Caching.Tests
{
[TestFixture]
public class BackgroundSchedulerFixture
{
[Test]
public void SchedulerCanBeStoppedWhenRequested()
{
BackgroundScheduler scheduler
= new BackgroundScheduler(null, null);
scheduler.Start();
Thread.Sleep(
2500);

Assert.IsTrue(scheduler.IsActive);

scheduler.Stop();
Thread.Sleep(
10000);

Assert.IsFalse(scheduler.IsActive);
}
}
}

#endif

這樣,就可以實現如果我們採用的是 DebugUnitTests方式編譯,就可以把測試代碼編譯到組件中,如果我們需要發佈的時候,則不需要編譯這部分代碼。
注意:項目中別忘了引用nunit.framework.dll

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章