網頁

2015年6月21日 星期日

測試專案使用 LocalDB - 使用 Entity Framework 的情境 + NCrunch

在上一篇「測試專案使用 LocalDB - 使用 Entity Framework 的情境」說明了測試專案裡如何有 LocalDB 的類別庫專案加入參考引用,然後在做一些設定處理後就可以讓測試專案使用 LocalDB 去對有使用 EF 的程式作單元測試。

但如果跟我一樣在開發時有使用 NCrunch 的朋友,可能就會遇到跟我同樣的問題,那就是在 Visual Studio 裡的測試總管執行測試都是正常的,但是使用 NCrunch 狀況下就是給你亮紅燈,測試程式並沒有任何問題,這是 NCrunch 的設計上以及預設設定所造成的執行錯誤結果。

如果沒有特別去做處理的話,很多人因為不得要領就可能會選擇讓 NCrunch 忽略有使用到 LocalDB 的測試,這還蠻可惜的,因為 NCrunch 的確是個相當好用的工具,所以就必須要想辦法讓一般使用的測試總管的執行可以正常之外,也必須要讓屬於設計期間的測試輔助工具 NCrunch 一樣可以正常的執行。


2016-11-08 更新

我目前已經不再使用這篇文章裡的做法,而是改用其他的方式,連結如下:

Repository 測試使用 LocalDB - Part.1
Repository 測試使用 LocalDB - Part.2
Repository 測試使用 LocalDB - Part.3
Repository 測試使用 LocalDB - Part.4

 

NCrunch

NCrunch 是個可以讓我們寫程式與測試的過程能夠順暢的一個好工具,用講的不是很能夠讓大家了解,大家可以直接到 NCrunch 的官網去看看,官網就直接提供操作影片,看了影片之後就可以明白我所說「讓寫程式與測試能夠順暢」的意思了。

NCrunch for Visual Studio - Concurrent Test tool for Visual Studio

image

或者也可以看看「流浪的小風」陳小風大大在 2012 年所寫的一篇介紹 NCrunch 的文章,

[Tool] 隨寫隨測的好用工具 - Ncrunch - 愛流浪的小風- 點部落

在 2012 年的時候,NCrunch 還是個仍在開發中的產品,所以當時在 Beta 階段都還是可以免費使用,但是之後正式推出就變成需要付費購買,而且售價雖然不是很貴,但也不便宜,買了之後還需要每年再購買授權費用(大約是第一次購買的一半價錢),

image

很多人對於要花錢買工作上要用的工具都會相當猶豫,大約九成的人是不會花自己的錢來買這些工具,如果公司有買的話就會去用,但是絕對不會掏自己的錢出來買。

我的想法是,公司無法用預算與經費去購買這些工具給我用,那麼我為了我自己的工作效率與產出,在我自己經濟能力許可的情況下,我自己花錢購買這些工具,讓我擁有這些工具的合法授權然後在我工作上使用。簡單的就是說,公司不花錢買,老子我自己掏錢買來用,我要進步、提昇效率,公司如果沒有整當理由就不應該來阻擾我,如果要阻止我這麼做,就只有兩種做法,一是公司就去花錢買來給我用,不然就真的是什麼都不讓我用的話,我就去找一家可以讓我用的公司(我要進步,你如果限制我,我就去找另一個願意跟我一起進步的環境)。

另外肯花錢投資,絕對是會有實質的回收與成長,就看你肯不肯。

離題了,回到 NCrunch 上面,有在專案裡導入測試的朋友,我建議可以下載會去試用看看(有 30 天免費試用期),去感受 NCrunch 所帶來的改變,然後去評估這樣的改變是否能夠帶給你實質的影響,最直接的就是工作效能與品質的提升,畢竟 159 USD 不算一筆小數目(約將近新台幣 5000 元),我當初在試用的第一天就決定要買下去,等到試用期買就毫不猶豫地刷下去,一直到現在仍然讓我相當滿意。

 

回到主題,上一篇完成了測試專案使用 LocalDB 的設定,雖然我有安裝 NCrunch,但通常一個新的測試專案剛開始的時候並不會開啟使用,而是等到一些都穩定而且都能夠正常通過目前的所有測試後才會將 NCrunch 開啟使用(因為一開始的測試並不是很多),於是乎我在加入 LocalDB 讓測試專案都可以讓所有測試通過之後,我就理所當然的要把 NCrunch 給開啟使用,

image

理所當然的,開啟 NCrunch 後就看到了一堆的紅燈
(如果什麼都沒做,開啟 NCrunch 後就得到全部的綠燈,那我也不用寫這一篇了呀 XD),

image

透過測試總管的執行測試都是正常無誤的,但是 NCrunch 的執行結果就是有問題,在試過很多種方法就是無法正常的讓 NCrunch 執行測試都可以通過,不過最後是有找到方法,這裡也就不繞圈子就直接跟大家說明(因為在臺灣有用 NCrunch 的開發者真的不是很多)。

 

Step.1 Configuration

NCrunch > Configuration…

image

要針對 NorthwindLibraryTests 專案作建置時的設定修改,下面是沒有修改的設定內容,

image

主要會針對 Build Settings 的幾個項目作調整,

第一項是「Copy referenced assemblies to workspace」,修改為 True

image

Copy Referenced Assemblies To Workspace - NCrunch Documentation

第二項是「Run pre-build events」,修改為 True

image

Run Pre Or Post Build Events - NCrunch Documentation

第三項是「Use build configuration

這一項設定屬於闇黑技,這一項本來的用意是讓我們可以決定讓 NCrunch 使用哪一個組態,不過這邊我們則是填入一個不存在的組態名稱「NCrunch」

image

Use Build Configuration - NCrunch Documentation

設定完成後的 NCrunch Configuration 內容

image

 

Step.2 修改程式

回到 NorthwindLibraryTests 測試專案,然後開啟 ProductDataAccesstests.cs,在類別名稱上面加上 DeploymentItem Attribute,

MSDN - DeploymentItemAttribute 類別 (Microsoft.VisualStudio.TestTools.UnitTesting)

MSDN - 如何:部署測試的檔案

我們要指定部署的項目是「NorthwindTest.mdf」這個檔案,程式修改如下:

image

當我們增加了 DeploymentItem Attribute 以及指定部署項目之後,當程式有修改後,NCrunch 就會馬上進行測試的執行,這個時候就會看到 NCrunch 出現了變化,

image

看到上面的截圖內容,可以看到 NCrunch 的執行測試結果都通過了,不過這是 NCrunch 的執行部分,這個時候還是要以測試總管的為準,當程式有任何的異動,在異動之後都務必要執行所有的測試,並且確認所有的測試都是通過的,當有紅燈出現,就代表剛才的異動是有問題的,所以在執行過後就得到了以下的結果……

image

 

Step.3 小手段

還是必須要以測試總管的測試執行結果為準,NCrunch 只是開發期的輔助工具,但如果就這樣放棄使用 NCrunch 也蠻可惜的,如果讓 NCrunch 去忽略掉這些受到影響的單元測試,這麼做好像也不太對,總之我們還是要想辦法讓測試總管的測試執行可以通過外,也要讓 NCrunch 的測試執行可以正常。

在 Step.1 裡有在 NCrunch Configuration 裡對 NorthwindLibraryTests 測試專案做了一些設定,其中有一項設定就是在「Use build configuration」填入「NCrunch」這一個不存在的組態名稱,然後我們就可以在測試類別裡去用這一個特性做一些調整。

這邊會用到 C# 前置處理器指示詞的 #if

MSDN - #if (C# 參考)

在 NCrunch Configuration 裡,預設會使用 Debug 組態去建置後再執行測試,但我們利用 NCrunch Configuration 裡可以讓我們自己去指定建置要用哪一個組態的特性,填入一個不存在的組態名稱,然後我們在程式裡使用 #if 去讓 DeploymentItem 在不是 Debug 的組態時可以被執行到,如此一來就可以讓 NCrunch 可以正常執行測試,而測試總管的測試執行也能夠正確無誤。

image

前面有提到過這樣的處理方式算是「闇黑技」,並不是一個正統的做法,我到覺得這似乎應該算是 NCrunch 的一個 Bug,不過到現階段為止採用這個方式都還能夠運作。

 

另外對於其他沒有安裝使用 NCrunch 的開發環境,使用相同的程式原始碼,不會影響原本單元測試的執行與測試結果。

image

 


WorksOnMyMachine

這一個闇黑技就提供給同樣有使用 NCrunch 的朋友(應該很少吧,有買有用的朋友,麻煩請在底下留言讓我知道我並不孤單),如果有比較好的解決方式,也歡迎交流方法,謝謝。

 

以上

1 則留言:

  1. 真的建議先試用個 30 天,批估各種面向,真的對自己的開發有實質幫助,而且有帶來效益,再考慮購買也不遲。

    回覆刪除