2010-08-15 66 views
4

我有一個函數可以對輸入向量列表執行分層聚類。返回值是對象層次結構的根元素,其中每個對象表示一個集羣。我想測試以下內容:爲返回對象層次結構的函數編寫單元測試

  1. 每個集羣是否包含正確的元素(以及其他屬性)?
  2. 每個羣集都指向正確的孩子嗎?
  3. 每個羣集都指向正確的父級?

我在這裏有兩個問題。首先,如何以可讀格式指定預期輸出。其次,我如何編寫測試斷言接受我提供的預期數據的同構變體?假設預期層級中的一個羣集有兩個子羣,分別爲AB。現在假設該簇由具有child1child2屬性的對象表示。我不在乎child1是否對應於羣集AB,只是它對應於其中之一,並且child2對應於另一個。該解決方案應該有點通用,因爲我會用不同的輸入數據寫幾個測試。

其實我這裏的主要問題是找到一種方法來指定預期的輸出,以可讀和可理解的方式。有什麼建議麼?

回答

2

如果存在同構結果,則應該有一個可以測試邏輯等價的謂詞。這對你的代碼單元很有幫助,也有助於實現單元測試。

這是Manoj Govindan的答案沒有字符串中間體的核心,因爲您對字符串中間體不感興趣(大概)然後將它們添加到測試機制將是一個不必要的錯誤來源。

至於可讀性問題,您需要顯示您認爲不可讀的內容,以便給出正確答案。也許等價謂詞會消除這一點。

+0

+1。完全同意。 – 2010-08-15 13:47:59

0

這是一個非常好的建議。這也有點迂迴。買者自負!

首先,編寫一個函數來創建一個集羣的字符串表示。你將不得不編寫單元測試來確保這個函數在所有情況下都能正常工作。格式可以是自定義或XML(不完全人性化,但通常易於使用分層數據)。你可以通過傳遞一個集羣來調用這個函數:string_representation(cluster)

其次,編寫一個變體以生成相同的輸出,而不傳入實際的集羣。像util.test.generate_string_representation('child1', 'child2')

第三,修改您的單元測試斷言,以便根據具體情況比較string_representation(cluster)generate_string_representation('child1', 'child2')的輸出。

actual = string_representation(f(*args, **kwargs)) 
expected = generate_string_representation('child1', 'child2') 
self.assertEqual(actual, expected) 

確保兩個字符串函數使用相同的機制來格式化其輸出。你不想最終追逐字符串中的微小差異。

告訴你,這是相當hackish。我希望別人有更好的答案。

0

感覺好像有一些空間可以將你的方法分解成小塊。專注於解析輸入和格式化輸出的人員可能與實際的集羣邏輯分離。用這種方式測試你的集羣方法會更少,並且處理易於理解和可測試的數據結構,如字典和列表。