首頁 > 後端開發 > Golang > 如何有效測試 Go 中的恐慌?

如何有效測試 Go 中的恐慌?

Susan Sarandon
發布: 2024-12-05 15:19:09
原創
449 人瀏覽過

How Can I Effectively Test for Panics in Go?

在 Go 中測試恐慌

在 Go 中編寫測試時,檢查恐慌可能是一種有用的技術。然而,與 Java 不同,Go 沒有明確的語法來選擇性地處理恐慌。

考慮以下範例:

func f(t *testing.T) {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
        }
    }()
    OtherFunctionThatPanics()
    t.Errorf("The code did not panic")
}
登入後複製

此程式碼嘗試使用復原函數從 OtherFunctionThatPanics 中的任何恐慌中復原。然而,確定函數是否發生恐慌或是否沒有發生恐慌可能具有挑戰性。

解決方案

建議的方法是專注於測試是否存在恐慌的恐慌。這可以透過反轉邏輯並確保在預期的情況下發生恐慌來實現:

func TestPanic(t *testing.T) {
    defer func() {
        if r := recover(); r == nil {
            t.Errorf("The code did not panic")
        }
    }()

    // Code under test
    OtherFunctionThatPanics()
}
登入後複製

此外,更高級的測試框架(例如Ginkgo 或Gomega)提供內建匹配器來斷言恐慌的發生:

Expect(OtherFunctionThatPanics).To(Panic())
登入後複製

實用函數

對於為了方便起見,您可以建立一個通用函數來斷言恐慌:

func assertPanic(t *testing.T, f func()) {
    defer func() {
        if r := recover(); r == nil {
            t.Errorf("The code did not panic")
        }
    }()
    f()
}
登入後複製

此函數可以按函數來斷言恐慌:

func TestPanic(t *testing.T) {
    assertPanic(t, OtherFunctionThatPanics)
}
登入後複製
此函數可以按函數來斷言恐慌:此函數可以按函數來按函數如下方式使用:

以上是如何有效測試 Go 中的恐慌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板