Stdin에서 읽는 Go 애플리케이션을 테스트하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-10-26 13:27:30
원래의
752명이 탐색했습니다.

How to Test Go Applications That Read from Stdin?

Stdin 입력으로 Go 애플리케이션 테스트

Go에서는 stdin에서 읽는 애플리케이션을 테스트하는 것이 어려울 수 있습니다. stdin 입력을 stdout으로 에코하는 간단한 애플리케이션을 생각해 보세요. 간단해 보일 수도 있지만 출력을 확인하는 테스트 사례를 작성하는 것은 어려울 수 있습니다.

실패한 시도

초기 접근 방식은 파이프를 사용하여 stdin 및 stdout을 시뮬레이션하는 것입니다. stdin 파이프에 수동으로 씁니다. 그러나 이는 경쟁 조건 및 예상치 못한 오류로 이어질 수 있습니다.

해결책: 논리 추출 및 독립 함수 테스트

stdin 및 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 함수를 직접 호출하여 기본 함수를 시뮬레이션합니다. 그런 다음 캡처된 출력을 예상 입력과 비교하여 함수가 입력을 올바르게 에코하는지 확인합니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!