vsts裡的unit test可以幫助我們實現我們希望的絕大多數功能.我們從實際的專案開發入手來介紹.假設我們新建了乙個.net專案,嗯,這是乙個有關快取的子專案,名字叫mycache.我們很認真的設計了專案的架鉤,進行了可行性分析,介面和抽象的建立,具體物件的建立,關係建立,最後編碼完成了.專案經理叫我們不要高興的太早,他要求我們必須對這個專案進行可靠的單元測試,因為這個子專案非常重要,將會被許多專案引用.儘管我們很有信心,但是沒有辦法,我們依然需要進行單元測試.我們使用了visual studio team system開發了這個專案,於是我們理所當然的使用自帶的unit test工具進行單元測試.
step1.我們需要建立專案檔案與測試檔案的對映關係.
難道要我們去手動建立嗎?這可是整個專案啊,裡面也許包含了幾十個類,數百個方法…當然沒那麼複雜!實際上,我們需要做的工作很少,只是動動滑鼠,等幾秒就可以了:)
在vs2005的ide環境下,選擇menu裡的test,繼續選new test項,這時將跳出個窗體,裡面可以選擇測試專案型別,這裡我們選擇unit test wizard,確定,輸入測試專案名,然後將又出現乙個窗體,裡面包含你當前的solution裡的所有project,我們選上我們的mycache,確定.ok,看見乙個進度條,這是在執行測試**的對映工作,等結束後,你就會發現,已經建立了乙個測試專案了,裡面的檔案完全對應你的目標專案,每個類包含的方法也是與目標類的方法一一對應,非常簡單,cool,mission complete!
step2.執行我們的測試專案.
接下來,我們怎麼進行測試呢?裡面有許多的類和方法,很多方法上還帶有像testmethod這樣的標籤屬性,但是我們關心的是,如何進行測試?絕對不是通常的f5來執行:(,在vsts裡,單元測試實際上有專門的管理工具.再次選到menu上的test選項,移到windows上展開自選單,裡面有好幾個選項,我們選擇testmanager開啟.在ide視窗內出現了乙個檢視結構的東西,在分割線的右邊是乙個listview,裡面全是當前測試專案包含的方法,我們隨便選幾個方法給勾上,右鍵,run checked test,下邊馬上有出現了test result窗體,裡面就是剛才你選擇的方法.如果不出意外的話,你的這個窗體內的方法result應該都是failed之類的資料,嗯,先不管這個,最起碼,我們已經執行了一次測試專案了,雖然有些奇怪,不過我們已經知道了如何執行乙個測試專案了,那麼再進入下乙個step吧:)
step3.看看我們的測試**裡都有些什麼.
雖然知道了怎麼執行測試專案,但莫名其妙的全部出錯,是怎麼回事呢?我們進入測試專案具體的**來看看.
我們會發現,每個測試類的名稱就是對應的目標類的名稱+"test",裡面的方法也是如此,如果是建構函式,則是諸如
constructortest或constructortestn這樣的形式,n為過載次數.每個方法裡面的**看上去也不奇怪,只是構造引數來呼叫而已,最後通過斷言來判斷(用過nunit的朋友不會陌生吧?).我們試著直接把乙個方法裡的斷言去掉看看,編譯,testmanager,run,嘿,果然,去掉斷言的方法就pass了!看來蒙老大不難呢,只要把所有的方法的斷言都給去掉,然後給老大看測試後的結果,呵呵…
step4.深入的了解一下方法上帶有的屬性的含義.
每個方法上幾乎都帶有testmethod這個屬性,我們直覺告訴我們,這肯定是表示被測試函式的意思.事實也正是如此,在unit test裡,有許多測試屬性,常用的如下:
屬性描述
testclass()
該屬性表示乙個測試裝置。
testmethod()
該屬性表示乙個測試用例。
assemblyinitialize()
在執行為執行選擇的第乙個testclass()中的第乙個testmethod()之前,執行帶有該屬性的方法。
classinitialize()
帶有該屬性的方法在執行第乙個測試之前呼叫。
testinitialize()
帶有該屬性的方法在執行每個testmethod()之前呼叫。
testcleanup()
帶有該屬性的方法在執行每個testmethod()之後呼叫。
classcleanup()
帶有該屬性的方法在執行 all 測試之後呼叫。
assemblycleanup()
在執行為執行選擇的第乙個testclass()中的第乙個testmethod()之後,執行帶有該屬性的方法。
description()
提供關於給定testmethod()的描述。
ignore()
由於某種原因忽略testmethod()或testclass()。
expectedexception()
當測試特定異常時,如果使用該屬性指定的異常不是從實現**引發,則測試不會失敗。
需要注意的是,上面的屬性不是可以適用於所有方法的,比如assemblyinitialize()和classinitialize()是必須是靜態方法的屬性.
我們可以把初始化的操作放在他們裡進行.
step5.修改測試方法及其斷言.
到現在,我們的思路開始清晰起來了,我們要開始做真正的測試了,不是僅僅去掉斷言就pass那麼簡單了:)
我們的測試思路應該是這樣:我們呼叫該方法,需要傳入什麼值,會影響什麼值,當它執行之後,會產生怎樣的期待值?我們把期待值與實際的值想比較,同時寫下斷言失敗的message.
還是以我們的mycahce為例,假如我們有個listcache類,裡面有個additemtotop(item)方法,表示把乙個item插入到當前鍊錶的頭部.我們實際的測試函式該這麼寫
guid id = system.guid.newguid();
item item = new item(id);
list.additemtotop(item);
assert.areequal(id, roomlist.firstlinkeditem.key, "插入後查詢獲得的key值與插入的物件的key值不相等!");
通過比對插入後的鍊錶的頭部的key與之前儲存的key值來判斷,這是不是一次成功的插入.
這只是個很簡單的例子,我們當然應該根據具體的方法需要實現的功能來定義測試**.
step6.over
完成了上面5部,相信你已經對vsts的unit test非常的熟悉了,接下來需要做的就是把你需要的測試的method都提供正確的測試**,注意,這裡我們甚至不要考慮我們本身的專案究竟有沒有實現該功能,但我們應該該知道,我們需要什麼功能.我們只針對應該產生的結果寫測試**.當測試不通過時,我們只需要修改我們的目標專案,而不再需要修改我們的測試專案.這其實正是tdd(測試驅動開發)的思想,我們如果要驗證我們的方法有沒有錯,只需要run一下test即可,真正實現了全自動化單元測試,這裡邊的實際開發效率的提高,只有你在真正體會過後才能明白:)
vs2005讀寫vs2008專案
首先你要確保你建的專案是.net framework 2.0的,而不是.net framework 3.5。1.用記事本開啟解決方案檔案 解決方案名 sln,然後修改最上面兩行為如下 microsoft visual studio solution file,format version 9.00 ...
vs2005讀寫vs2008專案
首先你要確保你建的專案是.net framework 2.0的,而不是.net framework 3.5。1.用記事本開啟解決方案檔案 解決方案名 sln,然後修改最上面兩行為如下 microsoft visual studio solution file,format version 9.00 ...
從VS2008專案轉為VS2005專案
vs2005轉vs2008 用文字編輯器開啟sln檔案 microsoft visual studio solution file format version 10.00 visual studio 2008 將以上內容修改後成為以下內容 microsoft visual studio solut...