2012-07-22 117 views
0

之前,我用來實現單元測試只是爲了測試的方法是否工作。但在其他地方看完之後,它出現時的方法失敗,我應該測試。單元測試:敏捷並知道要測試什麼?根據需求測試?

例如,一個方法應該拋出一個Exception傳遞一個字符串。

哪裏都來自這些要求?

我正在一個敏捷團隊工作,因此我們獲得了包含應用程序功能的基本要求的用戶故事。這些基本要求包括非常簡單要求(即密碼應是最多8個字符的長度)。

然後我根據需求從這個用戶故事創建任務。

因此,在測試時......究竟應該測試什麼?

我想我應該測試方法(它是作爲用戶故事一部分的一個任務的一部分)的功能應該是這樣,但我也應該測試它應該失敗嗎?

例如,當需求最多爲8個字符時,將12個字符傳遞給方法的參數(密碼)。我必須爲此包含一個測試用例嗎?

有沒有人知道一個很好的資源或鏈接,解釋更多關於這個問題?

我假設沒有要求我只能測試方法是否成功,而不是失敗,因爲我不知道什麼時候應該失敗,因爲沒有要求?

任何人可以提供幫助將是非常有益的。

+0

您有沒有想過[角落或邊緣情況](http://en.wikipedia.org/wiki/Corner_case)您的故事要求? – Akim 2012-07-22 17:53:37

回答

1

我認爲你對閱讀失敗太多了。它的意思是你寫的代碼(除了存根,將總是返回空像一個無效的值)之前編寫測試。這樣你就知道你有代碼在失敗時寫入。然後,你編寫代碼並再次測試。測試現在應該通過。測試驅動的開發應該總是像這樣工作。

+0

+1。更好的是,在你編寫代碼讓它通過之前,你的測試應該會失敗_帶有一個明確的,有意義的錯誤消息。 – DNA 2012-07-22 21:43:21

1

雖然你當然不能測試的可能性,你應該在至少測試代碼中考慮的可能性。

你的榜樣,在傳遞給方法的字符串不得超過8個字符(這是一個密碼 可怕要求的方式),該方法可能會是這個樣子

所以

public bool IsPasswordCorrect(string password) 
{ 
    if (password.Length > 8) 
     throw new ArgumentException("Password must not be greater than 8 characters."); 

    return password == SomeKnownPassword; 
} 

目標應該是100%的代碼覆蓋率。這意味着每行代碼實際上應該有至少一個相應的測試。因此,如果只考是針對「快樂路徑」(字符串,其不大於8個字符),然後throw線從來沒有測試。

該行代碼是爲響應需求而存在的,因此需要測試該需求。在這種情況下,你有幾個測試:

[TestMethod] 
public void MatchingPasswordsShouldBeAllowed() 
{ 
    // set the known password 
    // set the passed password 
    // call the method 
    // assert that the method returned true 
} 

[TestMethod] 
public void NonMatchingPasswordsShouldNotBeAllowed() 
{ 
    // set the known password 
    // set the passed password to something else 
    // call the method 
    // assert that the method returned false 
} 

[TestMethod] 
[ExpectedException(typeof(ArgumentException))] 
public void PasswordsShouldNotBeGreaterThanEightCharacters() 
{ 
    // set the known password 
    // set the passed password to something too long 
    // call the method 
    // assert that an exception was thrown 
} 

公告的測試方法的名稱。他們聽起來像要求。這個想法是,所述的要求應該分解成實際的規格。業務要求是:

  • 密碼應不超過8個字符

但那裏有隱含的要求是什麼?要求如:

  • 提供的密碼與已知密碼匹配應導致身份驗證。
  • 提供的密碼與已知密碼不匹配不應導致認證。

畢竟,該方法是做所有這些事情。如果該方法正在做某件事,那麼應該測試一些東西。最終,代碼所做的一切應該至少有一個映射到需求的相應測試。

事實上,如果測試寫得不錯,他們開始成爲的要求。這很好,因爲這意味着有問題的知識(需求)可以保存在一個地方(測試),而不是多個不同的地方(測試,代碼,文檔,白板等)。

如果有一行代碼沒有被測試執行,那麼爲什麼那行代碼在那裏?如果沒有測試,那就沒有要求了。如果沒有要求,請將其移除。

1

開始快樂路徑測試。你的快樂之路應該基於需求的用例。

當您覆蓋所有的幸福路徑,繼續邊界測試。所以,當它應該是8個字符的密碼,然後做7,8,9個字符的測試,並覆蓋這個場景。

後您覆蓋所有的快樂路徑和邊界測試,問自己我怎麼能寫失敗的測試?如果你能弄清楚,然後寫下來。如果它是應該提出的例外,然後覆蓋它。考慮到這一點,你可以很容易地弄清楚應該測試什麼,什麼是不必要的。