>백엔드 개발 >Golang >표준 입력(Stdin)과 상호 작용하는 Go 애플리케이션을 테스트하는 방법은 무엇입니까?

표준 입력(Stdin)과 상호 작용하는 Go 애플리케이션을 테스트하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-27 00:24:02665검색

How to Test Go Applications That Interact with Standard Input (Stdin)?

Stdin 상호 작용을 위한 Go 테스트 작성

소프트웨어 테스팅에서는 표준 입력 스트림인 stdin과 상호 작용하는 테스트를 작성해야 하는 경우가 많습니다. 이는 콘솔이나 사용자 인터페이스에서 입력을 읽는 애플리케이션을 테스트할 때 특히 중요합니다.

stdin에서 행을 읽고 이를 stdout으로 다시 에코하는 다음 Go 애플리케이션을 고려해 보세요.

<code class="go">package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    for {
        fmt.Print("> ")
        bytes, _, err := reader.ReadLine()
        if err == io.EOF {
            os.Exit(0)
        }
        fmt.Println(string(bytes))
    }
}</code>

이 애플리케이션을 테스트하려면 사용자 입력을 시뮬레이션하고 결과를 예상 출력과 비교하는 테스트 사례를 작성할 수 있습니다.

<code class="go">package main

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

func TestInput(t *testing.T) {
    subproc := exec.Command(os.Args[0])
    stdin, _ := subproc.StdinPipe()
    stdout, _ := subproc.StdoutPipe()
    defer stdin.Close()

    input := "abc\n"

    subproc.Start()
    io.WriteString(stdin, input)
    reader := bufio.NewReader(stdout)
    bytes, _, _ := reader.ReadLine()
    output := string(bytes)
    if input != output {
        t.Errorf("Wanted: %v, Got: %v", input, output)
    }
    subproc.Wait()
}</code>

그러나 이 테스트는 "원함: abc, Got:" 오류와 함께 실패할 수 있습니다. --- FAIL: TestInput (3.32s)".

이 문제를 해결하려면 다음 해결 방법을 고려하십시오.

기본 함수에서 stdin 및 stdout을 직접 조작하는 대신 별도의 함수를 정의하세요. io.Reader 및 io.Writer를 매개변수로 받아들이고 원하는 작업을 수행합니다. 그런 다음 주 함수에서 이 함수를 호출할 수 있으므로 테스트가 더 쉬워집니다.

예를 들어 Echo라는 함수를 만듭니다.

<code class="go">func Echo(reader io.Reader, writer io.Writer) {
    reader := bufio.NewReader(reader)
    for {
        fmt.Print("> ", writer)
        bytes, _, err := reader.ReadLine()
        if err == io.EOF {
            return
        }
        fmt.Println(string(bytes), writer)
    }
}</code>

테스트에서 Echo 함수를 대신 직접 호출합니다. stdin 및 stdout과 상호 작용:

<code class="go">// ...

func TestInput(t *testing.T) {
    inputReader := strings.NewReader("abc\n")
    outputWriter := new(bytes.Buffer)
    Echo(inputReader, outputWriter)
    result := outputWriter.String()
    if input != result {
        t.Errorf("Wanted: %v, Got: %v", input, result)
    }
}</code>

이 테스트는 stdin 및 stdout 조작에 의존하지 않고 Echo 기능을 직접 테스트하므로 이제 통과해야 합니다.

위 내용은 표준 입력(Stdin)과 상호 작용하는 Go 애플리케이션을 테스트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.