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 的朋友(應該很少吧,有買有用的朋友,麻煩請在底下留言讓我知道我並不孤單),如果有比較好的解決方式,也歡迎交流方法,謝謝。

 

以上

2 則留言:

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

      刪除

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。

最近的留言