>백엔드 개발 >Golang >Golang 함수에서 인수 전달을 효과적으로 테스트하는 방법은 무엇입니까?

Golang 함수에서 인수 전달을 효과적으로 테스트하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-08 17:52:10407검색

How to Effectively Test Argument Passing in Golang Functions?

Golang에서 인수 전달 테스트

Golang에서는 함수에 인수를 전달하는 것이 입력을 제공하는 일반적인 방법입니다. 코드의 신뢰성을 보장하려면 인수 전달의 정확성을 테스트하는 것이 중요합니다.

도전

다음 코드 조각을 고려하세요.

package main

import (
    "flag"
    "fmt"
)

func main() {
    passArguments()
}

func passArguments() string {
    username := flag.String("user", "root", "Username for this server")
    flag.Parse()
    fmt.Printf("Your username is %q.", *username)

    usernameToString := *username
    return usernameToString
}

이 프로그램에 -user=bla 인수를 전달하면 "사용자 이름은 'bla'입니다."가 올바르게 인쇄됩니다. 문제는 매번 코드를 수동으로 빌드하고 실행할 필요 없이 이 동작을 확인하는 테스트를 만드는 것입니다.

The Attempt

One might尝试使用 os.Args 테스트에서 인수를 제공하려면:

package main

import (
    "os"
    "testing"
)

func TestArgs(t *testing.T) {
    expected := "bla"
    os.Args = []string{"-user=bla"}

    actual := passArguments()

    if actual != expected {
        t.Errorf("Test failed, expected: '%s', got:  '%s'", expected, actual)
    }
}

그러나 이 테스트를 실행할 때 결과는 is:

Your username is "root".
Your username is "root".
--- FAIL: TestArgs (0.00s)
    args_test.go:15: Test failed, expected: 'bla', got:  'root'
FAIL
coverage: 87.5% of statements
FAIL    tool    0.008s

해결책

문제는 os.Args가 전역 변수이므로 ["args"]의 초기 값을 다음으로 덮어쓴다는 것입니다. 테스트는 프로그램의 다른 부분에 영향을 미칩니다. 이 문제를 해결하려면 원래 값을 보존하고 테스트 후에 복원할 수 있습니다.

oldArgs := os.Args
defer func() { os.Args = oldArgs }()
os.Args = []string{"cmd", "-user=bla"}

// ...

위 내용은 Golang 함수에서 인수 전달을 효과적으로 테스트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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