>  기사  >  백엔드 개발  >  Go에서 유사한 시그니처를 가진 함수에 대한 Reflection의 단위 테스트를 어떻게 간소화할 수 있나요?

Go에서 유사한 시그니처를 가진 함수에 대한 Reflection의 단위 테스트를 어떻게 간소화할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-11-03 05:31:02541검색

How Can Reflection Streamline Unit Testing for Functions with Similar Signatures in Go?

Go에서 리플렉션을 사용하여 함수 모음 테스트

문제

세트 단위 테스트 비슷한 시그니처와 반환 값을 가진 함수는 반복적이고 번거로울 수 있습니다. 기존 접근 방식에는 각 기능에 대한 개별 테스트를 작성하는 작업이 포함되어 있어 코드 중복이 발생할 수 있습니다. Reflection은 이 프로세스를 간소화하는 솔루션을 제공합니다.

Reflection을 사용한 솔루션

테스트에서 리플렉션을 활용하려면:

  1. Get 수신자의 값: ValueOf를 사용하여 테스트할 함수의 수신자를 나타내는 값을 얻습니다.
  2. 이름으로 함수 찾기: Value.MethodByName을 사용하여 다음에 해당하는 함수를 찾습니다. 수신자의 값 내에서 특정 함수 이름.
  3. 함수 호출: 매개변수에 대한 값의 빈 조각을 전달하는 동안 Value.Call을 사용하여 함수를 호출합니다(매개변수가 예상되지 않으므로).
  4. 반환 값 검색: 함수의 반환 값을 Call 메서드의 Value 개체로 캡처합니다.
  5. 반환 값 확인: Value.IsNil을 활용하여 결정합니다. 반환된 오류 값이 nil인 경우. 또한 기본 값 검사를 사용하여 객체 반환 값을 평가합니다.

예제 코드

<code class="go">var funcNames = []string{"Func1", "Func2", "Func3"}

func TestFunc(t *testing.T) {
    stype := reflect.ValueOf(s)
    for _, fname := range funcNames {

        fmt.Println(fname)

        sfunc := stype.MethodByName(fname)
        ret := sfunc.Call([]reflect.Value{})

        val := ret[0].Int()

        if val < 1 {
            t.Error(fname + " should return positive value")
        }
        if !ret[1].IsNil() {
            t.Error(fname + " shouldn't err")
        }

    }
}</code>

참고: 함수 이름이 지정되면 테스트가 패닉됩니다. 이를 완화하려면:

<code class="go">for _, fname := range funcNames {

    defer func() {
        if x := recover(); x != nil {
            t.Error("TestFunc paniced for", fname, ": ", x)
        }
    }()
    fmt.Println(fname)
}</code>

위 내용은 Go에서 유사한 시그니처를 가진 함수에 대한 Reflection의 단위 테스트를 어떻게 간소화할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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