使用标准输入测试 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>
这个测试用例通过直接调用 Echo 函数来模拟 main 函数,并使用一个用于 stdin 输入的缓冲区和一个用于捕获输出的缓冲区。然后将捕获的输出与预期输入进行比较,确保函数正确回显输入。
以上是如何测试从 Stdin 读取的 Go 应用程序?的详细内容。更多信息请关注PHP中文网其他相关文章!