php小編百草今天為大家介紹一個測試覆蓋率的方法。在軟體開發過程中,測試覆蓋率是一項重要的指標,它可以幫助我們評估測試案例對於程式碼的覆蓋率。而如果發現有語句未被覆蓋到,我們可以透過一些手段來解決這個問題。在本文中,我們將探討如何測試覆蓋率以及如何處理未涵蓋的語句。
我有一個名為 setupConfig() 的 go 函數,並且我有一個 Test_setupconfig 來測試它並測試它很好。但是當我對其進行覆蓋測試並查看 HTML 報告時,它顯示我對 Viper 包返回的一些錯誤的處理沒有被覆蓋。為什麼沒有涵蓋這一點?我該如何處理?
覆蓋率報告告訴您在測試期間執行了多少程式碼。您看到的是這些 if
區塊中的 return
語句未經過測試,這表示您沒有任何旨在失敗並傳回錯誤的單元測試。在測試您的程式碼在給定正確輸入時是否有效的同時,確保在給定錯誤輸入時測試正確且安全地失敗也很重要。
但是,這是一個奇怪的情況,因為這些錯誤不在您自己的套件中,這些錯誤來自 viper
套件。此時,重要的是要問自己一個問題「我真正測試的是什麼?」。如果您使用 viper
包,那麼假設該包經過了徹底的測試,並且通過為 viper 錯誤創建您自己的測試,您只是在這些測試上加倍,而沒有真正的改進。出於這個原因,有時我們選擇省略測試這些分支,因為實際上,如果viper 包錯誤- 並假設您的所有輸入都是靜態的並且像所示的那樣進行硬編碼- 那麼這不是您的代碼的問題,而是viper
函式庫的問題。
如果您真的想要獲得 100% 的覆蓋率並測試所有決策樹,唯一的方法是將 viper
套件放在某種抽象後面。最有可能的是傳遞到函數中的接口,允許多種實現,無論您是在生產中運行還是在測試中運行。
話雖如此,不建議像這樣對函數中的所有值進行硬編碼。理想情況下,您希望配置結構的值來自本機設定檔、環境變數、命令列標誌或它們的組合。透過這樣做,您可以讓此設定函數接受用於檢索配置的接口,從而使該函數易於測試,因為您需要做的就是在測試中模擬該接口的實現。所以它會像下面這樣:
config.go
:
type ConfigController interface { GetInput() Config } func setupConfig(controller ConfigController) error { config := controller.GetInput() // your code here }
config_test.go
:
type mockConfigController struct {} func (m *mockConfigController) GetConfig() Config { return Config{ // your config here } } func Test_setupConfig(t *testing.T) { configController := &mockConfigController{} err := setupConfig(configController) // rest of test here }
透過這樣做並為您的setupConfig()
函數提供接受接口,這意味著您可以在生產中運行時為其提供函數實現,而且在運行測試時也可以使用硬編碼的測試數據來模擬它。在與其他服務(例如資料庫)互動時,也經常使用它。您可以讓程式碼接受一個接口,告訴它如何與資料庫互動並在測試中模擬它,而不必在運行測試時啟動資料庫並連接到它。這使您可以隔離部分程式碼並僅測試您想要的內容。
以上是去測試覆蓋率,如果語句未覆蓋的詳細內容。更多資訊請關注PHP中文網其他相關文章!