在使用Visual Studio進行單元測試時,有時我們需要明確限定測試順序,例如: TestB()會應用到TestA()產生的結果,所以要依TestA->TestB的順序進行。在單元測試哲學的最佳實務(Best Practices)裡,最高境界應追求各測試間不具任何相依性(Avoid creating dependencies between tests such that tests need to run in a particular order. Each test should be autonomous. 參考),不過在某些案例中,要徹底斬斷某兩個兩個測試的相依性,讓個別測試足能獨立執行所需模擬的資料規模,有時會讓人想哭...

像我這種對於軟工美學不怎麼積極的小孬孬實務派,Visual Studio倒是提供一個簡便的機制解決測試順序問題--Ordered Test(已排序測試),用它就可以指定一連串測試依特定的順序執行,避開為了讓每個測試獨立執行要付出的可觀代價。

做法是在專案中新增Ordered Test項目,產生一個*.orderedtest檔案,當點選.orderedtest檔時,VS2010會開啟Ordered Test Editor專屬編輯器,可以用來選取測試並指定各測試執行的優先順序。而在測試時,Ordered Test的一連串測試會被視為一個測試項目。

不過,今天在使用Ordered Test時,遇到一些小狀況,分享一下我的處理經驗:

  • Solution中有Web專案,加入測試專案並新增Ordered Test,在點選.orderedtest要編輯時,編輯器沒出現,而是彈出"Value does not fall within the expected range"
    用關鍵字查到一則Bug Report因Support人員無法重現問題而未解,而另一則討論則有人說要重灌,害我嚇出一身冷汗。但後來我找到的解決方法是另外獨立開啟Test Project,再一一加回DLL及Web,就排除了上述問題。(不知其所以然,但可解決問題)
  • Solution已有測試專案及DLL專案,在加入Web專案後,點選.orderedtest要編輯時出現The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG))
    解法與上一則相同,先開Test專案,再逐一加DLL、Web專案。
  • .orderedtest本身是一個XML,使用文字編輯器修改其內容後,VS2010即便關閉Ordered Test Editor再開啟,仍一直都是修改前的內容。
    要先關閉測試專案,再重新開啟,直接修改.orderedtest XML的結果才會被讀取呈現。另外,處理orderedtest問題時,常常要重啟VS2010才會生效,修復過程中,記得要以重啟後的結果為準。

Comments

# by Franma

黑大 其實若是遇到 Test 之間有相依的話,其實一開始就寫在一起也沒關係的。 您可以先針對 B 寫好 UT 後,就直接在同一個 Test Method 後加上 A 的。(Assert 要有兩組) 像小弟的 CRUD 測試 就是直接寫在同一個 Test Method 中。 不然在跑 UT 時還要特地把原本的 Test Method 的選項勾掉不要執行。當您的 Test Method 很多的時候就會顯得不方便。 小弟是認為拆太細的話,會增加太多不必要的時間。 供參考~~ :)

Post a comment