🥶
go mod init mainをするとテストコードは動かない
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