使用標準輸入測試 Go 應用程式
在 Go 中,測試從標準輸入讀取的應用程式可能具有挑戰性。考慮一個將 stdin 輸入回顯到 stdout 的簡單應用程式。雖然看起來很簡單,但編寫驗證輸出的測試案例可能會帶來困難。
嘗試失敗
最初的方法是使用管道模擬 stdin 和 stdout並手動寫入標準輸入管道。但是,這可能會導致競爭條件和意外失敗。
解決方案:提取邏輯並測試獨立函數
而不是使用stdin 和在main 函數中執行所有操作stdout,創建一個單獨的函數,接受io. Reader 和io.Writer 作為參數。這種方法允許主函數呼叫該函數,而測試函數直接測試它。
重構程式碼
<code class="go">package main import ( "bufio" "fmt" "io" ) // Echo takes an io.Reader and an io.Writer and echoes input to output. func Echo(r io.Reader, w io.Writer) { reader := bufio.NewReader(r) for { fmt.Print("> ") bytes, _, _ := reader.ReadLine() if bytes == nil { break } fmt.Fprintln(w, string(bytes)) } } func main() { Echo(os.Stdin, os.Stdout) }</code>
更新測試案例
<code class="go">package main import ( "bufio" "bytes" "io" "os" "testing" ) func TestEcho(t *testing.T) { input := "abc\n" reader := bytes.NewBufferString(input) writer := &bytes.Buffer{} Echo(reader, writer) actual := writer.String() if actual != input { t.Errorf("Wanted: %v, Got: %v", input, actual) } }</code>
這個測試案例透過直接呼叫來模擬main 函數,並使用一個用於stdin 輸入的緩衝區和一個用於捕獲輸出的緩衝區。然後將捕獲的輸出與預期輸入進行比較,確保函數正確回顯輸入。
以上是如何測試從 Stdin 讀取的 Go 應用程式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!