goo test 시 환경 변수 설정에 사용되는 정적 해석 도구 tenv
이번에는 Go의 정적 분석 도구
tenv
를 소개해 드리겠습니다.Go1.17부터 사용된 테스트입니다.Setenv
Go1.17부터.Setenv라는 방법을 추가했습니다.
Go1.17 이전에test에서 환경 변수를 사용했을 때os.Setenv 사용
하지만os.Setenv를 사용하면 각 테스트의 환경 변수가 상속됩니다.
예를 들어 이런 테스트 코드를 실행해 보았다
package main_test
import (
"fmt"
"os"
"testing"
)
func TestMain(t *testing.T) {
fmt.Println(os.Getenv("GO"))
os.Setenv("GO", "HACKING GOPHER")
}
func TestMain2(t *testing.T) {
fmt.Println(os.Getenv("GO"))
}
go test ./... -v
=== RUN TestMain
--- PASS: TestMain (0.00s)
=== RUN TestMain2
HACKING GOPHER
--- PASS: TestMain2 (0.00s)
PASS
ok a 0.154s
이렇게 TestMain이 설정한 환경 변수는 TestMain2에서도 계승되었다.상술한 상황을 피하기 위해서 사전에 확인해 주십시오.Getenv에서 얻은 값을 t.Cleanup 등으로 회신해야 합니다.
Go1.17에 설치된 테스트입니다.Setenv를 사용하면 테스트가 끝난 후 설정된 환경 변수가 폐기됩니다.
다음은 샘플 코드입니다.vi
package main_test
import (
"fmt"
"os"
"testing"
)
func TestMain(t *testing.T) {
fmt.Println(os.Getenv("GO"))
t.Setenv("GO", "HACKING GOPHER")
}
func TestMain2(t *testing.T) {
fmt.Println(os.Getenv("GO"))
}
go test ./... -v
=== RUN TestMain
--- PASS: TestMain (0.00s)
=== RUN TestMain2
--- PASS: TestMain2 (0.00s)
PASS
ok
TestMain2는 TestMain이 설정한 값을 계승하지 않았다.tenv
내가 개발한 정적 분석 도구
tenv
를 이용하여 기존의 테스트 코드로testing을 진행한다.Setenv를 사용하지 않은 곳을 감지할 수 있습니다.설치
*testing.T
*testing.B
testing.TB
의 모든 부분이 기본적으로 감지됩니다.package main
import (
"fmt"
"os"
"testing"
)
func TestMain(t *testing.T) {
fmt.Println(os.Getenv("GO"))
os.Setenv("GO", "HACKING GOPHER")
}
func TestMain2(t *testing.T) {
fmt.Println(os.Getenv("GO"))
}
func helper() {
os.Setenv("GO", "HACKING GOPHER")
}
이쪽 코드에 tenv 검사를 넣으면 이렇게 돼요.go vet -vettool=(which tenv) ./...
# a
./main_test.go:11:2: os.Setenv() can be replaced by `t.Setenv()` in TestMain
에 -tenv.all
의 옵션을 추가하여 *_test.go
의 파일에서 사용os.Setenv
을 모두 검사합니다.package main
import (
"fmt"
"os"
"testing"
)
func TestMain(t *testing.T) {
fmt.Println(os.Getenv("GO"))
os.Setenv("GO", "HACKING GOPHER")
}
func TestMain2(t *testing.T) {
fmt.Println(os.Getenv("GO"))
}
func helper() {
os.Setenv("GO", "HACKING GOPHER")
}
go vet -vettool=(which tenv) -tenv.all ./...
# a
./main_test.go:11:2: os.Setenv() can be replaced by `t.Setenv()` in TestMain
./main_test.go:19:2: os.Setenv() can be replaced by `testing.Setenv()` in helper
이 도구는 CI에도 포함될 수 있습니다.CircleCI
- run:
name: install tenv
command: go get github.com/sivchari/tenv
- run:
name: run tenv
command: go vet -vettool=(which tenv) -tenv.all ./...
GitHub Actions
- name: install tenv
run: go get github.com/sivchari/tenv
- name: run tenv
run: go vet -vettool=(which tenv) -tenv.all ./...
Golangci-lint를 통해서도 이용할 수 있어요.
위의 linter는 Golangci-lint도 편입되어 Golangci-lint를 통해서도 이용할 수 있습니다.
Goolangci-lint에서 실제로 했던 홍보는 다음과 같다.
앞으로 PR에 직접 만든 linter를 발표하고 싶어요!그렇게 생각하는 사람의 예가 될 수도 있다고 생각해요.
총결산
이번에 소개된 linter는 GiitHub에 공개됐다.
괜찮다면 스타가 될 수 있다면 힘이 될 것 같아 기쁘다.
끝까지 읽어주셔서 감사합니다.
Reference
이 문제에 관하여(goo test 시 환경 변수 설정에 사용되는 정적 해석 도구 tenv), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/sivchari/articles/e04f1a20567b6a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)