回答

9

(我假設你使用「功能測試」是指涉及整個系統或應用程序被啓動和運行測試。)

我將單元測試功能我寫的,有三個原因:

  • 它幫助我更快地工作代碼。 「單元測試失敗,修復代碼,單元測試通過」的週轉時間通常是短於「功能測試失敗,修復代碼,功能測試通過」的批次
  • 它幫助我設計我的代碼在一個更清潔的方式
  • 它幫助我理解我的代碼,以及它的意思,當我來維護它做的事情。如果我做出改變,它會讓我更有信心,我沒有破壞任何東西。

(包括bug修復,通過Epaga的建議。)

我會強烈建議邁克爾羽毛"Working Effectively with Legacy Code"給你如何啓動單元測試這是不爲它設計一個代碼庫的提示。

+1

但是「集成測試」呢?我想對相同的代碼進行單元,集成和功能測試是沒有意義的......當功能測試寫成開發人員測試(使用JUnit或TestNG,使用Java)時,與集成測試是否有區別? – 2009-08-20 13:35:28

3

這取決於您的功能測試是自動執行還是手動完成。如果是後者,那麼任何類型的自動化測試套件都很有用,因爲運行這些單元/集成測試的成本遠低於運行手動功能測試的成本。您可以在那裏展示真正的投資回報率我會建議從編寫一些集成測試開始,如果時間/預算在將來允許,請參閱單元測試。

+0

我們的自動化功能測試,並且我們也做手工測試。儘管今後我們會越來越依賴於自動化測試。這些仍然沒有那麼快~20分鐘來運行基礎知識。 – danswain 2009-02-17 09:07:48

+0

我向你保證,這比發動一系列針對您的應用程序測試的一個部落,並等待他們整理測試結果要快得多。 :) – 2009-02-17 16:04:57

3

追溯寫遺留代碼的單元測試往往不值得。堅持功能測試,並將其自動化。

然後,我們所做的是有任何錯誤修復(或新功能)必須伴隨單元測試至少測試修復的指導原則。這樣你就可以讓項目至少朝着正確的方向前進。

我不得不同意Jon Skeet(我怎麼可以不?)在推薦「Working Effectively With Legacy Code」,它確實是一個有用的脫脂/閱讀。

1

是的,他們是值得的,自從我開始對代碼進行單元測試以來,現在我的代碼更快了。我花更少的時間修復錯誤,花更多的時間思考我的代碼應該做什麼。

12

大多數人都沒有意識到是什麼自動化單元測試是:

  1. 要使用新技術實驗
  2. 爲了證明如何使用代碼的一部分
  3. 爲了確保死蟲住宿死
  4. 爲了使您能夠重構代碼
  5. 要允許您更改代碼
  6. 的任何主要部分創建一個低水印低於此值,您的產品質量不可能下降
  7. 提高開發速度因爲現在,您知道知道某些工作有效(而不是希望它在客戶報告錯誤之前就會發生)。

所以,如果這些原因中的任何一個給你帶來好處,自動化的單元測試是爲你準備的。如果沒有,那麼不要浪費你的時間。

1

我買了一個應用程序來諮詢有關21000行開關語句的FAT(測試)。在案例陳述中,大多數功能單元都是幾十到幾百行。該應用程序由幾個變體構建,因此交換機中有許多#ifdef部分。

它不是爲單元測試而設計的 - 它根本沒有考慮因素。 (它的設計意義在於它有一個確定的,易於理解的體系結構 - malloc一個結構,用指向結構的指針作爲lparam發送一個用戶消息到主循環,然後在處理消息時釋放它但形式沒有遵循功能,這是良好設計的核心原則。)

要將單元測試添加到新功能將意味着模式的重大突破;要麼你需要把你的代碼放在除了大開關之外的其他地方,並且加倍變型選擇機制的複雜性,或者讓大量的腳手架將消息放入隊列中以觸發新的功能。

因此,儘管單元測試新功能當然是可取的,但如果系統還沒有被很好地考慮,它並不總是實用的。要麼重構系統以允許進行單元測試,要麼進行大量的工作,或者最終對代碼進行替代測試,並將其剪切並粘貼到現有框架中 - 並且單元測試代碼的副本不是經過單元測試的代碼。

3

碰巧,我昨天在這個主題上讀了a paper。作者比較了微軟和IBM四個小組內的項目,事後對比了使用單元測試和功能測試的項目以及單獨使用功能測試的項目。引述作者:

「的情況下的結果研究 表明,四種產品 的預覽版 缺陷密度爲40%和90%之間的減少相對 到未使用 類似工程TDD練習主觀上, 團隊在 採用TDD之後的初始開發時間經歷了15-35%的增加 。「

這表明,當你添加新的功能添加到您的項目這肯定是值得做單元測試。

1

,當你想知道的東西的東西你測試一下。如果你知道你的產品(系統,單位,服務,組件...)是去工作,那麼就沒有必要對它進行測試。如果你不確定它是否會工作,你可能有一些問題了。無論這些問題都值得回答是風險和優先級的問題。

如果你確定你的產品將工作,和你沒有任何關於它的問題,還有一個問題THA值得問:爲什麼我沒有任何問題?

---邁克爾B.

1

單元測試確實是額外的工作,但它從長遠來看回報。下面是 優於集成測試:

  • 你得到一個迴歸測試套件充當安全網重構的情況下 - 同樣可以說是集成測試,雖然它可以是艱難的,如果 的說測試涵蓋了一段代碼。修改代碼時
  • 單元測試得到即時反饋 - 這 反饋可以是非常準確的,指向其中異常 是方法。
  • 這些測試運行起來很便宜:它們運行速度非常快(通常幾秒鐘), 沒有任何安裝或部署,只是編譯和測試。所以他們可以經常運行。
  • 很容易添加一個新的測試來重現問題,一旦它被識別, 和它增強迴歸套件,或回答一個問題(「如果 這個函數不用一個空參數調用會發生什麼.. 「)。

這兩者之間顯然有一些重疊,但它們是互補的,因爲它們都具有優勢。

現在,像任何軟件工程過程中,測試必須是taylored根據 的項目需求。

對於未經單元測試的遺留代碼,我推薦將單元測試限制爲添加到代碼中的新功能,因爲單元測試很難引入。在這方面, 我只能第二個(第三個?)「Working Effectively with legacy code」這本書的建議,以幫助在現有的 代碼庫中進行單元測試。