🥶

go mod init mainをするとテストコードは動かない

2022/02/19に公開

go modが原因でテストコードを実行できなかった話。

前提

下記ファイルをGOPATH配下に用意する
main.go

package main

import (
	"fmt"
)

func One() int {
	return 1
}

func main() {
	fmt.Println(One())
}

main_test.go

package main

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

var Debug bool = true

func TestIsmain(t *testing.T) {
	v := One()
	assert.Equal(t, 1, v)
}

go.modの設定をする

% go mod init main

やったこと

go testによりテストコード実行。
見覚えのないファイルでエラーが発生。
ビルドにも失敗しているのでテストができていない。

% go test
# main.test
/var/folders/99/wzh7jh3x6px2h7z7v4yv0bnh0000gn/T/go-build1681870695/b001/_testmain.go:13:2: cannot import "main"
/var/folders/99/wzh7jh3x6px2h7z7v4yv0bnh0000gn/T/go-build1681870695/b001/_testmain.go:21:17: undefined: _test
FAIL    main [build failed]

エラーがおきた原因

go mod initでmodule名をmainにしたのが原因
main以外のものを指定すれば問題なし。

% go mod init example

正常にテストできましたね。

% go test       
PASS
ok      example 0.224s

コードベースでは分かりませんが、module名をmainに設定してのテストを想定していないからだと思われる。
もしある程度プログラムが作成してある状態で、moudle名を変更したい場合に全てのファイル
import "main/hoge" -> import "モジュール名(go mod initで指定したもの)/hoge"に書き換えないとエラーがでます。

最後に

go mod使っているのにGOPATH配下で実行しているのは、go modの仕組みを理解してないからなので突っ込まないでください。
golangの教材が古いバージョンだったので気づくのに時間がかかった....

Discussion