2012-10-14 100 views
1

假設一個方法接受一個字符串作爲輸入參數,並且該字符串只能包含1到8之間的數字和短劃線(「/」)。單元測試有效字符的最佳實踐

在開發測試驅動時,您將如何編寫單元測試來驗證該方法是否進行了適當的參數檢查?

我的第一個想法是顛倒了需求並測試了一個ArgumentException,即具有一個數據驅動的單元測試,該測試使用每個其他可能的字符調用該方法,並期望一個ArgumentException。然而,...感覺有點像使用大錘龜裂堅果...

這樣的情況是否有任何最佳做法?

回答

3

我首先想到的是扭轉了要求和測試一個ArgumentException

這是函數應該做的第一件事。如果它是一個公共函數,那麼它應該假設它的參數是無效的,除非證明是另外的。您聲明的要求很容易用正則表達式檢查 - 如果該正則表達式失敗,則拋出一個ArgumentException或OutOfRangeException。

你會如何編寫單元測試,以驗證該方法做了正確的參數檢查

兩種測試方法重複調用的目標函數是你所需要的。對於第一個有一個有一個有效的參數調用,並確保你檢查返回值,如果有的話。
對於第二種測試方法在其中激發一堆無效輸入,包括帶有特殊字符的字符串,大寫字母和小寫字母等,無效輸入應該會觸發異常,從而導致測試失敗(您需要修飾此方法與預期的異常屬性)。

+0

這正是我的想法。但是......這個「一堆無效輸入」是否可能是一個可能的輸入字符?我如何實現這一目標? – Mephisztoe

+0

@Mephisztoe不,你不能現實地做每一個錯誤的字符 - 只是集中在一個很好的大小輸入,你知道未通過驗證,無論是由於長度,字母字符,太多斜線等。 – slugster

+0

這是一個你可能想看Pex的地方--Pex非常適合「建議」一組好的邊界條件案例。 http://research.microsoft.com/en-us/projects/pex/ – Mathias

0

您可能會嘗試使用數據驅動的單元測試(MSDN:How to: Create a Data-Driven Unit Test)。

這允許您定義數據源,如XML,CSV或數據庫表,並將幾種可能的輸入放入其中。單元測試只寫入一次,但在源文件的每個數據行中執行一次。

您可以填充,例如,一個帶有一些有效輸入字符串的CSV文件並進行了測試,另一個帶有一些無效字符串的CSV文件,檢查方法爲[ExpectedExcetion(typeof(...))](或者您的代碼在這種情況下應該做的任何事情)。

這很容易實現(請參閱上面的鏈接),如果您願意,甚至可以隨機生成各種格式的數千種可能的輸入。