組件 vs 集成 vs 功能測試
最近我發現我對不同類型測試的理解可能並不完全正確。
例如,單元測試是測試一個單元,其中與其他單元的互動基於模擬(假貨、存根)。所以,沒有與文件系統、執行緒、時間的互動……
對我來說,組件測試是圍繞一個組件(更多單元)進行的測試,我同時使用了模擬和“真實”資源。我將它們都用於輸入模擬和輸出測試。任何看起來更合適的東西。例如,我在模擬目前仲裁狀態的變化,但我斷言事件儲存在 RTDB 中。
對我來說,這些組件通常是一個應用程序的切片。
功能測試我認為是圍繞我在生產中執行的應用程序(exe)的(黑盒)測試。
那麼,這真的是真的嗎?組件測試是否僅基於模擬?如果是,為什麼?我如何確定模擬足夠好?我們是否應該從功能測試中執行應用程序?為什麼它與執行緒中應用程序主常式的引導不同?什麼是集成測試?
我想听聽其他意見以及你是如何做到的。你有哪些測試,你如何維護它們以及你的團隊中誰負責它們?
乾杯!
你的問題有點沒有重點,但我還是會嘗試給出答案。
這裡已經討論了各種測試:什麼是單元測試、集成測試、冒煙測試、回歸測試?
然而,區分不同類型的測試的主要不是使用雙精度數(如模擬、存根等)。這是您通過不同測試所追求的目標,以區分它們。
在單元測試中,目標是測試您編寫的程式碼段的行為是否符合您的預期. 也就是說,您正在根據您對程式碼應該如何表現的假設來測試您的程式碼。加倍(模擬)只是實現此目標的一種手段,同時確保 a) 測試所有場景(包括錯誤情況) b) 確定性測試結果(獨立於時間/調度/環境條件) c) 快速測試建構和執行 d) 簡單的測試設置 e) 獨立於庫問題(不完整、有問題,…)。如果您可以通過使用真正的庫來達到所有這些標準,那麼您不必將庫翻倍。例如,在大多數情況下,您不會為作為程式語言標準庫的一部分的容器庫(列表、集合、地圖……)創建雙精度 - 您通常只需通過使用圖書館。
辨識關於如何與其他軟體部分互動的誤解不是單元測試的目標。而且,由於將與您的單元互動的軟體部分加倍不是強制性的,但完全可以,在這種情況下,您甚至無法辨識此類誤解:每當您將其中一個依賴項加倍時,您就是在根據您的理解實現加倍(可能還有你的誤解)其他組件。因此,辨識關於如何與其他組件互動的誤解是集成測試的目標。在集成測試中,您將這些組件以及您想要測試的互動組合在一起。根據與單元測試類似的標準,其他組件也可以連結或加倍。
一旦你意識到單元測試和集成測試的不同目標,你也會意識到不同的目標將導致建構不同的測試案例集。因此,單元測試套件仍然是單元測試套件,無論您是否可以與連結真實庫而不是使用雙精度庫相處融洽。
然後,(子)系統測試再次引入不同的目標,例如測試一組組件是否一起實際實現了該(子)系統的所需功能。例如,組件 A 和 B 對結構列表進行操作,除其他外,最終列表應進行排序。現在,A 和 B 的開發人員可能會假設另一個將進行排序。並且,如果它們都不需要為自己的程式碼對數據進行排序,a) 兩個組件都將具有不測試被排序輸出的單元測試套件,並且 b) 將有針對它們之間的互動的集成測試A 和 B 不一定測試來自另一個的輸入是否已排序。但是,通過(子)系統測試,將測試所有必需功能的存在並檢測到缺失的排序。再次,
但是,您正在詢問component-testing,它很可能是(子)系統測試的同義詞,或者描述(子)系統測試和構成該組件的集成測試的組合的術語(子)系統。而且,您提到的**功能測試很可能是軟體系統級別的(子)系統測試(因此,不是子測試,而只是系統測試)。**而且,最後回答我所理解的問題,現在應該很清楚,使用雙精度不是對測試套件進行分類的可靠標準,但測試的各自目標是。