2014-04-18 64 views
0

我上它具有以下約束的唯一ID提供的簡單要求工作的獨特性:我怎麼能單元測試隨機產生的用戶名

  1. 用戶名具有「用戶」
  2. 的ID前綴是由數字和小寫字母的
  3. 的ID必須是在所有預先存在的IDS獨特的會員表
  4. 的ID是10個字符長不包括前綴

現在我的問題是爲了測試與預先存在的ID有關的唯一用戶名相關的第三點,我可以生成一個隨機設置的Id的可以說20或50,並斷言他們都是獨特?

我只是不確定這個測試是否會確保唯一性算法會在1,00,000個生成的ID中生成唯一的ID。

只需要注意一下,我需要首先按照TDD進行測試。

+0

我不認爲單元測試是測試隨機性的正確工具。單元測試應該調用一個方法並根據預期的結果測試返回的值。測試隨機性的問題在於,對於大多數您想測試的內容,沒有預期的值。 –

回答

1

測試[僞]隨機數發生器是......很難。有關該主題的一些資源。

但是,爲什麼不直接使用系統提供的東西GETE你,你想去哪裏?

推測,您的數據存儲在數據庫中。

大多數數據庫都提供了用於生成獨特的順序編號的工具。你可以使用它。

生成一個GUID非常獨特,在C#或SQL(通常)中都很簡單。

請注意,您的用戶ID的域是36 (0 – 3,656,158,440,062,975):你要獲得64位的價值,將其轉換爲長,把它模36 讓你的用戶ID。

您也可以計算[salted]用戶數據的加密哈希,並執行相同的操作。

無論如何,您都需要編寫代碼,以便處理生成重複ID的情況。

2

根據計算隨機ID所需的時間,您可以驗證對於nn接近1,000,000),它們都是唯一的。 20或50是不夠的,以確保1,000,000中的唯一性1。

要實際測試此功能,您可以跟蹤以前對Randomizer的調用,並斷言每個新ID都不會被以前的任何一個複製。

此外,您似乎也可能只是使用GUID

+0

由於「Ids長度爲10個字符,不包括前綴」要求 –

+0

否,GUID將不起作用,但是具有基本36編碼的序列可以工作。另外,n是'36 ^^ 6-1'。 – Mitch

3

考慮分離「唯一性」檢查(即作爲單獨的對象)並分別進行測試 - 這樣就可以通過嘲笑「IsUnique」檢查輕鬆測試「隨機生成的數字已被使用」。

與測試唯一性檢查相比,feed已知爲非唯一值(可能需要模擬「已知值集合」),並確保它正確地失敗。

請注意,如果現有項目的數量與所有選項的數量相當(即「卡片洗牌」不可接受),則使用「隨機」查找唯一標識可能會變得非常慢。自動遞增數字/數據庫字段更容易實現/證明正確性。