표준 출력에 기록된 문자열을 Go로 테스트하는 방법
개시하다
본고는 단원 테스트 테스트를 통해 표준 출력의 문자열을 쓰는 방법을 소개한다.이 방법으로 fmt.Print 및 fmtPintf 함수 출력을 테스트할 수 있는 문자열입니다.
문자열의 출력 대상을 표준 출력에서 Buffer로 변경하여 테스트 수행
Go칙os.Pipe 함수를 사용하여 표준 출력 또는 표준 오류 출력의 출력 위치를 수정할 수 있습니다.
이 함수, fmt를 사용합니다.Print 등 표준 출력 (os.Stdout) 에서 출력된 문자열이 예상한 테스트에 부합되는지 작성해 보십시오.
테스트 대상의 함수
테스트 대상 코드.fmt.문자열의 단순 함수는 Print 함수로만 출력됩니다.
// テスト対象の関数
func Print() {
fmt.Print("test1")
fmt.Print("test2")
}
이 함수를 실행하면 표준 출력은 문자test1test2
를 출력합니다.테스트 도우미 함수 준비
테스트를 진행하기 전에 다음 테스트용 조수 함수를 준비하세요.조수 함수 중의 os.Pipe 함수를 사용합니다.
// Stdoutに書き込まれた文字列を抽出する関数
// (Stderrも同じ要領で出力先を変更できます)
func extractStdout(t *testing.T, fnc func()) string {
t.Helper()
// 既存のStdoutを退避する
orgStdout := os.Stdout
defer func() {
// 出力先を元に戻す
os.Stdout = orgStdout
}()
// パイプの作成(r: Reader, w: Writer)
r, w, _ := os.Pipe()
// Stdoutの出力先をパイプのwriterに変更する
os.Stdout = w
// テスト対象の関数を実行する
fnc()
// Writerをクローズする
// Writerオブジェクトはクローズするまで処理をブロックするので注意
w.Close()
// Bufferに書き込こまれた内容を読み出す
var buf bytes.Buffer
if _, err := buf.ReadFrom(r); err != nil {
t.Fatalf("failed to read buf: %v", err)
}
// 文字列を取得する
return strings.TrimRight(buf.String(), "\n")
}
조수 함수로 독립된 것은 테스트가 실시된 후에 Stdout의 출력 위치로 되돌아오기 위해서이다.출력 주소를 되돌려 주지 않으면 다른 테스트를 할 때 로그를 확인할 수 없기 때문에 주의해야 합니다.앞으로 조수 함수t.Helper()
를 잊지 마세요.테스트 실현
상기 조수 함수를 사용하여 진행된 단원 테스트는 다음과 같다.
// テスト関数
func TestFoo(t *testing.T) {
// テスト対象の関数が出力した文字列を取得する
got := extractStdout(t, Print)
// 想定される文字列
want := "test1test2"
if got != want {
t.Errorf("failed to test. got: %s, want: %s", got, want)
}
}
총결산
보충: 조수 함수는os입니다.피프로 뭐 해?
Go os.Pipe 함수를 사용하면 OS의 파일 스크립트에 파이프(Unix의 pipe 시스템 호출)를 생성할 수 있습니다.Go os.Stdout의 실제 상태는 표준 출력에 연결된 파일 객체(os.File)입니다.이 객체를 파이프의 Writer 객체로 대체하여 출력 대상을 변경합니다.다음은 프로그램이 실행될 때와 테스트가 실행될 때의 차이점입니다.
프로그램 실행 시
테스트 수행 시
참고 자료
Reference
이 문제에 관하여(표준 출력에 기록된 문자열을 Go로 테스트하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/glassonion1/articles/8ac939208bd455텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)