>백엔드 개발 >Golang >유형 매개변수를 인스턴스화하지 않고 Go에서 일반 함수를 효과적으로 테이블 테스트할 수 있는 방법은 무엇입니까?

유형 매개변수를 인스턴스화하지 않고 Go에서 일반 함수를 효과적으로 테이블 테스트할 수 있는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-04 11:09:10880검색

How Can We Effectively Table Test Generic Functions in Go Without Instantiating Type Parameters?

Go에서 일반 함수 테스트

도전 과제:

Go 1.18에는 제네릭이 도입되었지만 어떻게 효과적으로 일반 테이블 테스트를 수행할 수 있습니까? T에 대해 인스턴스화가 불가능할 때의 함수 값?

문제 설명:

현재 테스트 방법에서는 T 값을 인스턴스화할 수 없기 때문에 각 함수에 대한 테스트 논리를 다시 선언해야 합니다.

접근 방식:

테스트 접근 방식은 공통 재사용에 중점을 두어야 합니다. 일반 함수의 구체적인 특성을 고려하면서 논리를 고려합니다.

해결책:

1. 재사용 가능한 테스트 논리:

테스트 설정 및 결과 확인과 같은 일반적인 작업을 캡슐화하는 runTestCase[T Item](tc testCase[T])와 같은 일반 테스트 함수를 만듭니다.

2. 인스턴스화 고려 사항:

일반 함수는 결국 특정 유형으로 인스턴스화되어야 합니다. 그러나 가능한 모든 유형 매개변수를 테스트할 필요는 없습니다.

3. 유형별 동작에 집중:

연산자 의미에 따라 동작이 다른 경우에만 특정 유형에 대한 함수 테스트에 집중하세요. 예를 들어 숫자와 문자열에 대한 연산자 또는 숫자와 문자열에 대한 비교 연산자입니다.

예:

이 테스트 코드는 일반 runTestCase 함수를 사용하여 다양한 유형을 테스트합니다. 매장 지도의 값:

func TestStore(t *testing.T) {
    t.Run("ints", testInt)
    t.Run("strings", testString)
}

func testString(t *testing.T) {
    t.Parallel()
    tests := []testCase[string]{
        {
            start:    store[string]{},
            key:      123,
            val:      "test",
            expected: store[string]{123: "test"},
        },
        // ...
    }
    for _, tc := range tests {
        t.Run(tc.name, runTestCase(tc))
    }
}

func testInt(t *testing.T) {
    t.Parallel()
    tests := []testCase[int]{
        {
            start:    store[int]{},
            key:      123,
            val:      456,
            expected: store[int]{123: 456},
        },
        // ...
    }
    for _, tc := range tests {
        t.Run(tc.name, runTestCase(tc))
    }
}

위 내용은 유형 매개변수를 인스턴스화하지 않고 Go에서 일반 함수를 효과적으로 테이블 테스트할 수 있는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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