首頁 > 後端開發 > Golang > 主體

如何在不中斷測試套件的情況下測試 Go 中的「os.Exit」場景?

Susan Sarandon
發布: 2024-11-12 17:08:02
原創
630 人瀏覽過

How to Test `os.Exit` Scenarios in Go Without Disrupting the Test Suite?

Go 中的單元測試退出場景

覆蓋各種測試場景對於健壯的軟體開發至關重要。在 Go 中,測試呼叫 os.Exit 的函數提出了獨特的挑戰。我們如何在不干擾整個測試套件的情況下測試退出場景?

考慮以下函數,注定會失敗:

func doomed() {
  os.Exit(1)
}
登入後複製

為了有效測試呼叫此函數是否會觸發退出,您將需要採用一種策略,將os.Exit 呼叫限制在測試中,並防止其影響其他測試。

測試 os.Exit

Go 團隊的核心成員 Andrew Gerrand,在他的演講中提供了解決這個問題的巧妙方法。讓我們實作這個解決方案:

main.go(要測試功能的程式)

package main

import (
    "fmt"
    "os"
)

func Crasher() {
    fmt.Println("Going down in flames!")
    os.Exit(1)
}
登入後複製

main_test.go(測試 Crasher 功能)

package main

import (
    "os"
    "os/exec"
    "testing"
)

func TestCrasher(t *testing.T) {
    // Check if "BE_CRASHER" environment variable is set.
    if os.Getenv("BE_CRASHER") == "1" {
        Crasher()
        return
    }

    // Invoke the test again with "BE_CRASHER=1" to trigger the Crasher call.
    cmd := exec.Command(os.Args[0], "-test.run=TestCrasher")
    cmd.Env = append(os.Environ(), "BE_CRASHER=1")
    err := cmd.Run()

    // Validate exit code.
    if e, ok := err.(*exec.ExitError); ok && !e.Success() {
        return
    }
    t.Fatalf("process ran with err %v, want exit status 1", err)
}
登入後複製

執行:

此解決方案的工作原理是:

  • 透過exec 在單獨的進程中再次exec呼叫go test。指令,限制對 TestCrasher 測驗的執行。
  • 透過環境變數 (BE_CRASHER=1) 傳遞標誌來控制第二次呼叫的行為。
  • 檢查標誌,如果設定的話,呼叫 Crasher 並立即退出。
  • 驗證退出程式碼以確保測試能如預期般通過。

使用這種方法,您可以自信地在 Go 中測試退出場景,而不會中斷測試套件的其餘部分。

以上是如何在不中斷測試套件的情況下測試 Go 中的「os.Exit」場景?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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