首页  >  文章  >  后端开发  >  如何测试从 Stdin 读取的 Go 应用程序?

如何测试从 Stdin 读取的 Go 应用程序?

Patricia Arquette
Patricia Arquette原创
2024-10-26 13:27:30802浏览

How to Test Go Applications That Read from Stdin?

使用标准输入测试 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn