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 중국어 웹사이트의 기타 관련 기사를 참조하세요!