goo test 시 환경 변수 설정에 사용되는 정적 해석 도구 tenv

13685 단어 Gogolanglinttech
처음 뵙겠습니다.
이번에는 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.Btesting.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를 발표하고 싶어요!그렇게 생각하는 사람의 예가 될 수도 있다고 생각해요.
https://github.com/golangci/golangci-lint/pull/2221

총결산


이번에 소개된 linter는 GiitHub에 공개됐다.
괜찮다면 스타가 될 수 있다면 힘이 될 것 같아 기쁘다.
끝까지 읽어주셔서 감사합니다.
https://github.com/sivchari/tenv

좋은 웹페이지 즐겨찾기