2012-07-24 57 views
1

我有一個班ListContainer。 的類列表的容器,並允許3操作:如何測試容器類?

  1. 添加
  2. 刪除
  3. getNotValid(無效元素返回列表)。

該列表在類中是私有的,所以我無法檢查添加真正添加元素。 您認爲我應該如何測試添加功能?

我認爲我應該通過getNotValid來檢查它。

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 
Container::Container() { 
} 


void Container::add(Element element) { 
    pthread_mutex_lock(&mutex); 
    list.push_back(element); 
    pthread_mutex_unlock(&mutex); 
} 

void Container::remove(unsigned int elementId) { 
    pthread_mutex_lock(&mutex); 
    list<Element>::iterator it; 
    for (it = list.begin(); it != list.end(); ++it) { 
     if (element->id == elementId) { //TODO is it the real check 
      list.erase(it); 
     } 
    } 
    pthread_mutex_unlock(&mutex); 
} 

list<Element> Container::getNotValid() { 
    list<Element> result; 
    pthread_mutex_lock(&mutex); 
    list<Element>::iterator it; 
    for (it = list.begin(); it != list.end(); ++it) { 
     if (element->isNotValid()) { 
      result.push_back(*it); 
     } 
    } 
    pthread_mutex_unlock(&mutex); 
    return result; 
} 
+1

是否正在使用列表中的「有效」項目進行任何操作,還是純粹用於返回無效項目的列表? – 2012-07-24 12:47:39

+0

getNotValid刪除並返回無效元素 – 2012-07-24 12:57:14

回答

1

類通常通過測試某種操作將會對一些應用程序的狀態的影響,通過任一它們的公共接口或(使用一個集成測試)測試。

如果私人列表只是允許API的用戶檢索無效項目,那麼我會說你只需要使用add,removegetNotValid方法來測試列表。

如果以某種方式使用有效項目(例如寫入文件系統或數據庫),那麼您應該通過集成測試來測試該類,並確保對應用程序狀態的預期效果確實取得了地點。

+0

我覺得我們應該儘量通過公開API來測試,因此在這種情況下,測試將添加無效的元素,刪除,並檢查getnot有效返回什麼。額外的測試將基於公共API進行。 – 2012-07-24 16:25:14

0

測試私人物品是不必要的。添加和刪​​除該列表必定會有一些可衡量的效果。測試包含ListContainer的類應告訴您ListContainer是否正常工作。

也許你可以添加一些額外的代碼,以便更容易評論?

0

add如何操作ListContainer客戶端?假設我使用你的課程,添加一個項目..然後是什麼?我如何在這種狀態下使用它?我可以觀察任何行爲改變嗎?狀態改變?添加項目的屬性更改?我應該能夠觀察一些變化,這就是測試時應該關注的內容。 可觀察到的變化

或者,您可以公開private列表進行單元測試(通過更改它們在測試類/程序集方面的可見性)。

1

寫一個你無法測試的類很容易。就你而言,這個類沒有任何公共API來測試它。這意味着除了檢查可以調用三種方法並且不會拋出異常外,您不能編寫任何嚴重的測試。

另一方面,你不應該添加方法來創建一個可測試的類。注意不應該 - 它不是不得。如果你認真地進行測試,有足夠有用的測試比保持API簡單更重要。

就你而言,添加一個size()方法是有意義的 - 當你添加/刪除元素時,列表的大小應該改變。

或者添加一個toString()方法。在調試時,這將是有用的,編寫測試:

ListContainer c = new ListContainer(); 
c.add("x"); 
assertEquals("[x]", c.toString()); 
+0

愛toString的想法 – 2012-07-24 13:05:35

+0

只需要小心一點,因爲人們喜歡更改'toString()',這會破壞測試。 – 2012-07-24 13:07:36