軟件測試中WF單元測試測試Activity的行為
我們只是使用VSTS的單元測試工具,捕獲了一個期待的異常,這樣簡單的行為測試當然是不能滿足我們的需求的,我們要進一步測試Activity的更多,更復雜的行為。
比如我們有一個LogActivity 負責寫日志,任何調用它的結果等同于調用一個ILog接口的一個Write()方法。我們就要寫一個單元測試,測試是否LogActivity的調用等同于對ILog接口的Write()方法的調用。
有的人不禁要問了,這樣的測試如何做呢?我們的測試工具只支持Assert操作,難道我要去Check日志文件,看看兩個日志是否相等嗎?答案是否定的,我們不會這么做,因為這樣還屬于“狀態測試”的范疇,而不是“行為測試”。
還好有人想到了這一點,提供給我們現成的工具,這就是Mock Object Framework。Mock Object Framework基于單元測試中的這樣幾個問題:
1、在一個龐大的系統中,成百上千個類共同協調完成一個功能。往往一個調用的背后,是幾十個類在共同工作,而且很多類的創建很耗費資源和時間。在這樣的情況下,運行一個測試的代價可想而知,何況我們每次對代碼做一次改動,就要運行單元測試呢。
2、很多代碼都需要調用外部資源,比如,讀取配置文件,讀取數據庫,調用遠程的Web Service等等。這樣的操作很費時間,最主要的是依賴外部的資源。如果外部資源處了問題,測試將無法進行下去。
3、對系統的行為無法準確捕獲。一個簡單的調用,系統究竟調用了那些類的那個方法,調用了幾次,做了幾次查詢,修改,等等,一系列的操作都無法準確測試,難以保證單元測試的嚴謹性。
基于以上幾點考慮(當然不是全部的),Mock Object Framework出現了。它解決了這些問題,
所以成為了TDD的必備武器!
Mock Object Framework的主要功能:
1、Mock Object---顧名思義,就是模仿對象。正是由于單元測試中龐大的對象群的創建太耗費資源和時間,所以我們使用Mock Object來代替那些對象。Mock Object是輕量級的,代價很低,所以大大減少單元測試的開銷。
2、對于一些需要訪問外部資源的對象,Mock可以用硬編碼代替對外部資源的訪問。從而提高效率。
3、Mock Object Framework可以準確地記錄所模仿的對象的一切操作,使得我們可以準確地測試對象的行為是否符合要求。
4、Mock Object Framework可以模仿接口,抽象類,或者尚未實現的類,從而加快開發速度。
關于Mock Object Framework,大家可以去找一些資料。
這里我們使用的是Rhino Mock。
下面開始我們的單元測試:
在前文的工程中,加入一個名叫的Activity,繼承自BaseEmployeeActivity。定義三個屬性:
StoreNewAcmeEmployee public AcmeEmployee NewEmployee public IEmployeeRepository EmployeeDataStore { get; set; } protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) return ActivityExecutionStatus.Closed; |
我們設定這個Activity的功能是:根據給定的參數,創建一個NewEmployee對象,把它存儲在EmployeeDataStore對象中。我們先不實現Execute()方法。
注意:EmployeeDataStore會在后面使用依賴注入賦值。
為了測試這個Activity,我們如法炮制,在測試工程中加一個新的Activity:StoreNewAcmeEmployee_Accessor,繼承自StoreNewAcmeEmployee。并Wrap它的Execute方法。
文章來源于領測軟件測試網 http://www.kjueaiud.com/