unit testing test介紹 單元測試什麼不能測試?




unit test python (19)

你可以測試它們,但是它們不會是單元測試。 單元測試是不跨越邊界的,例如跨越線路,觸及數據庫,與第三方運行/交互,觸摸未經測試/遺留的代碼庫等。

除此之外的任何事情都是集成測試。

標題中問題的明顯答案是你不應該單元測試你的API的內部,你不應該依賴別人的行為,你不應該測試任何你不負責的東西。

其餘的應該足以讓你能夠在裡面寫你的代碼,而不是更多,而不是更少。

項目編寫單元測試的哪些部分幾乎或者是不可能? 數據訪問? FTP?

如果有這個問題的答案,那麼%100的覆蓋率是一個神話,不是嗎?


Answer #1

配置是另一個在單元測試中很難測試的項目。 應該根據配置進行集成測試和其他測試。 這減少了測試的冗餘,並釋放了大量的時間。 嘗試單元測試配置往往是輕浮的。


Answer #2

目標不是100%的代碼覆蓋率,也不是80%的代碼覆蓋率。 單元測試容易寫,並不意味著你應該寫,單元測試很難寫,並不意味著你應該避免這種努力。

任何測試的目標都是以最可愛的方式來檢測用戶可見的問題。

編寫,維護和診斷由測試標記的問題(包括誤報)的總成本是否值得特定測試捕獲的問題?

如果測試所帶來的問題是“昂貴的”,那麼你可以付出努力去研究如何測試和維護測試。 如果測試捕獲的問題微不足道,那麼編寫(和維護!)測試(即使在代碼更改的情況下)也更為簡單。

單元測試的核心目標是保護開發人員免於執行錯誤。 單就這一點就應該表明,太多的努力是浪費。 在某一點之後,有更好的策略來獲得正確的實施。 用戶可見的問題也是在某一點之後,由於正確地實現了錯誤的東西,只能通過用戶級別或集成測試來實現。


Answer #3

“單元測試什麼都不要測試?” 豆類只有吸氣劑和製定者。 推理:通常浪費時間可能會更好地花費在測試別的東西上。


Answer #4

GUI的單元測試也很困難,儘管不是不可能的。


Answer #5

任何需要非常大而復雜的設置。 當然你可以測試FTP(客戶端),但是你需要設置一個FTP服務器。 對於單元測試,您需要一個可重複的測試設置。 如果你不能提供它,你不能測試它。


Answer #6

@GarryShutler

我實際上通過使用假的smtp服務器(Wiser)單元測試電子郵件。 確保你的應用程序代碼是正確的:

http://maas-frensch.com/peter/2007/08/29/unittesting-e-mail-sending-using-spring/

類似的東西可能可以為其他服務器完成。 否則,你應該能夠嘲笑API ...

順便說一句:100%的覆蓋率只是一個開始...只是意味著所有的代碼實際上是一次執行的bean ....沒有關於邊緣案例等。


Answer #7

數據訪問是可能的,因為你可以設置一個測試數據庫。

一般來說,“不可測試”的東西是FTP,電子郵件等等。 但是,它們通常是可以依賴的框架類,因此不需要測試是否將它們隱藏在抽象之後。

另外,100%的代碼覆蓋率是不夠的。


Answer #8

在單元測試中,你不應該測試任何不屬於你的單元的東西; 在他們的背景下測試單位是另一回事。 這是簡單的答案。

我使用的基本規則是,你應該單元測試任何觸及你單位邊界的東西(通常是課堂,或者你的單位可能是什麼),然後嘲笑其餘部分。 無需測試某些數據庫查詢返回的結果,只需測試您的單元吐出正確的查詢即可。

這並不意味著你不應該忽略那些難以測試的東西; 即使異常處理和並發問題也可以使用正確的工具很好地測試。


Answer #9

大多數測試需要巨大而昂貴的(資源或計算時間成本)設置是集成測試。 單元測試(理論上)應該只測試小部分的代碼。 個別功能。

例如,如果您正在測試電子郵件功能,創建一個模擬郵件是有道理的。 該模擬的目的是確保您的代碼正確地調用郵件程序。 看看你的應用程序是否真的發送郵件是一個集成測試。

區分單元測試和集成測試是非常有用的。 單元測試應該運行得非常快。 在檢入代碼之前,應該可以輕鬆地運行所有的單元測試。

但是,如果您的測試套件包含許多集成測試(設置和拆卸數據庫等),則您的測試運行可能會輕鬆超過半個小時。 在這種情況下,開發人員很可能在進行檢查之前不會運行所有的單元測試。

所以要回答你的問題:做單元測試的東西,更好地實現為集成測試(也不測試getter / setter - 這是浪費時間;-))。


Answer #10

在一個大型項目中,確保100%的覆蓋率是一個很好的目標 ,但是對於大多數在部署之前修復一個或兩個錯誤的項目來說,創建詳盡的單元測試是不值得的。

在一個非常詳細的層面上對錶單提交,數據庫訪問,FTP訪問等進行徹底的測試往往只是浪費時間; 除非編寫的軟件需要非常高的可靠性(99.999%的東西),單元測試太多可能是過度的和實時的下沉。


Answer #11

如果設置單元測試所需狀態的代碼比要測試的代碼複雜得多,我傾向於畫線,並找到另一種測試功能的方法。 在這一點上,你不得不問你怎麼知道單元測試是正確的!



Answer #13

任何不完全確定的東西都是單元測試的“否”。 你希望你的單元測試始終以相同的初始條件通過或失敗 - 如果像線程,隨機數據生成,時間/日期或外部服務這樣的怪事會影響到這一點,那麼你不應該在你的單元測試。 時間/日期是一個特別惡劣的情況。 通常你可以設計一些代碼來讓日期能夠被注入(通過代碼和測試),而不是依賴當前日期和時間的功能。

儘管如此,單元測試不應該是您的應用程序中唯一的測試級別。 實現100%的單元測試覆蓋通常是浪費時間,並迅速滿足收益遞減。

更好的辦法是進行一系列更高級別的功能測試,甚至是集成測試,以確保系統“一旦聯合起來”正確工作 - 單元測試按照定義不會進行測試。


Answer #14

在這裡,我發現(通過抨擊邁克爾羽毛的東西可以是一個答案:

他說,

一個測試不是一個單元測試,如果:

  • 它與數據庫交談
  • 它通過網絡進行通信
  • 它涉及到文件系統
  • 它不能和其他任何單元測試同時運行
  • 你必須對你的環境做特別的事情(比如編輯配置文件)來運行它。

他又在同一篇文章中補充道:

一般來說,單元測試應該是小的,他們測試一個方法或幾個方法的交互。 當你將數據庫,套接字或文件系統訪問拉入你的單元測試時,它們不再是真正的關於這些方法的東西; 他們是關於你的代碼與其他軟件的整合。


Answer #15

你不測試什麼? 任何不可能中斷的事情

當涉及到代碼覆蓋範圍時,您希望實現您實際編寫的代碼的100% - 這就是說,您不需要測試第三方庫代碼或操作系統代碼,因為代碼已經交付給您測試。 除非不是。 在這種情況下,你可能想要測試它。 或者在這種情況下,如果有已知的錯誤,您可能需要測試這些錯誤的存在,以便得到何時修復的通知。


Answer #16

FTP,電子郵件等可以用服務器仿真來測試。 這是困難的,但可能的。

不可測試的是一些錯誤處理。 在每個代碼中都有錯誤處理永遠不會發生。 例如在Java中,必須捕捉許多異常,因為它是接口的一部分。 但是使用的實例永遠不會拋出它。 或者,如果存在所有可能的情況下,開關的默認情況。

當然,一些不需要的錯誤處理可以被刪除。 但是,在未來有沒有編碼錯誤,那麼這是不好的。


Answer #17

一般來說FTP,SMTP,I / O應該使用一個接口進行測試。 接口應該由一個適配器(用於真實代碼)和一個模擬單元測試來實現。

沒有單元測試應該運用真正的外部資源(FTP服務器等)


Answer #18

首先對代碼進行單元測試的主要原因是驗證代碼的設計。 有可能獲得100%的代碼覆蓋率,但不是沒有使用模擬對像或某種形式的隔離或依賴注入。

請記住,單元測試不是針對用戶的,而是針對開發者和構建系統在發布之前用於驗證系統的。 為此,單元測試應該運行得非常快,盡可能少的配置和依賴性摩擦。 盡量在內存中盡可能地做,並避免使用測試中的網絡連接。





testing-strategies