이동 중 Local Plural 패키지를 테스트하고 싶습니다.

Go에서 로컬 복수 패키지를 테스트하기 어렵다는 문제에 직면했습니다. 예를 들어 아래와 같이 calculate 디렉토리 아래의 모든 패키지( outLogsrc )를 테스트하고 싶습니다.

./src
  |- calculate/
    |- calculate.go
    |- calculate_test.go
    |- go.mod
  |- outLog/
    |- outLog.go
    |- outLog_test.go
    |- go.mod
main.go
go.mod
go.modcalculateoutLog를 만들지 않으면 아래 명령을 사용하여 모든 패키지를 테스트할 수 있습니다(즉, calculateoutLog를 모듈로 초기화하지 않으면).
그러나 이러한 패키지를 모듈로 초기화하지 않으면 main.go에서 사용할 수 없으므로 초기화해야 합니다.

이 기사의 목표는 로컬 복수형 패키지를 Go에서 패키지(모듈)로 초기화한 후 테스트하는 방법을 아는 것입니다.
Google에서 좋은 TIPS를 찾을 수 없어서 시행 착오를 겪었습니다. 공유하고 싶습니다.

반면 Go에는 interface가 있으므로 DI(Dependency Injection) on Go을 사용할 수 있습니다. 내 생각에는 모든 패키지 간의 종속성을 분할한 후 각 로컬 패키지를 테스트하는 것이 더 나을 것 같지만(단일 책임 원칙?), 저는 Go를 처음 사용하는 사람이라 현재 DI를 사용하기 어렵습니다. DI에 대한 중간 진행으로 이 기사 주제를 공유했습니다.

각 로컬 패키지(모듈) 초기화



테스트하기 전에 다음 명령을 사용하여 각 패키지를 초기화합니다.

go mod init [any name of your package you decided]
go mod tidy

그런 다음 각 패키지에 대한 경로를 만듭니다. main.go가 있는 디렉토리에서 다음 명령을 실행합니다.

go mod edit -replace [any name of your package you decided]=[relative path to each module]
go mod tidy

이 글에서는 각 패키지에 playground/calculate, playground/outLog라는 이름을 붙였으므로 main.go는 다음과 같은 소스 코드를 가진다.

package main

import (
    "fmt"
    "playground/calculate"
    outlog "playground/outLog"
)

func main() {
    ol := outlog.OutLog{To_console: true, To_file: false}
    ol.Error("Success to output an Error🎉")
    res := calculate.Calculate(3)
    fmt.Printf("The result of calculation:%d", res)
}

모든 패키지를 테스트하는 방법?


main.go가 있는 디렉토리의 테스트 파일



아래와 같이 main.go가 있는 디렉토리에 테스트 파일을 만들면 모든 패키지를 테스트할 수 있다고 확신합니다.

package main

import (
    "playground/calculate"
    outlog "playground/outLog"
    "testing"
)

func TestCal(t *testing.T) {
    result := calculate.Calculate(2)
    if result != 2*2 {
        t.Fatal("Not match the result of calculation.")
    }
}

func TestConsole(t *testing.T) {
    outLog := outlog.OutLog{To_console: true, To_file: false}
    rec, err := outLog.Error("Please find me!!🐬")
    if rec == "" || err != nil {
        t.Fatal("The failed to output an error.")
    }
}

그런 다음 main.go가 있는 디렉토리에서 다음 명령을 실행합니다.

go test -v ./...

그러나 main.go가 있는 디렉토리에 많은 테스트 파일을 만들어야 하기 때문에 이런 방식으로 테스트하고 싶지 않습니다.

go test -v [패키지 이름]을 사용하여 모든 패키지 테스트



이것이 더 나은 해결책이라고 생각하지만 패키지에 로그를 사용하면 이 명령이 길어질 것입니다.
이 기사에서 go.modmain.go는 다음과 같습니다.

module playground/main

go 1.18

replace playground/outLog => ./src/outLog

replace playground/calculate => ./src/calculate

require (
    playground/calculate v0.0.0-00010101000000-000000000000
    playground/outLog v0.0.0-00010101000000-000000000000
)
main.goplayground/calculate를 테스트하려면 playground/outLog가 있는 디렉토리에서 다음 명령을 실행합니다.

go test -v playground/calculate playground/outLog

해당 명령이 실행된 후 다음 결과를 얻습니다.

=== RUN   TestCal
--- PASS: TestCal (0.00s)
PASS
ok      playground/calculate    (cached)
=== RUN   TestConsole
2022/06/17 15:55:19 [2022-06-17T15:55:19+09:00][Error] - Please find me!!🐬
--- PASS: TestConsole (0.00s)
PASS
ok      playground/outLog   (cached)

이러한 방식으로 디렉토리main.go에 너무 많은 테스트 파일이 있을 필요가 없습니다. 좋은 지적입니다.

결론



이 문제를 해결할 최선의 아이디어가 없습니다. 이를 해결하기 위한 좋은 아이디어가 있으시면 알려주시면 대단히 감사하겠습니다.

이 원본 기사는 내가 쓴 다음과 같습니다. 이것은 이 원본 기사의 일부를 일본어에서 영어로 번역한 것입니다.





Go로 하나도에 複数팍케이지의 테스트를 하러 가다




zenn.dev

좋은 웹페이지 즐겨찾기