Goでmain
を使用してテストしません。 Goには独自のテストフレームワークがあります。
まず、Goのパッケージレイアウトとテストツールについて説明する"How to Write Go Code"を読んでください。それはGoツールの多くがレイアウトを期待しているので、それらと一緒に行くのが最善です。
パッケージを作成するときは、~/go/src
のどこかに入れてください。私はあなたが必ずしもアップロードするつもりはないものの、あなたが使いたいリポジトリを使って大会に従うことをお勧めします。より良い組織を作ります。 go get
は~/go/src/
に他の外部パッケージも入れます。
たとえば、これをGithubにアップロードするつもりはないが、~/go/src/github.com/schwern/newpackage/
を使用します。 github.com/schwern
は、Goソースツリー内で自分の「組織」として機能します。
newpackage.go
には、package newpackage
の下に関数を入れます。
$ cat ~/go/src/github.com/schwern/newpackage/newpackage.go
package newpackage
func MyNewFunc() string {
return "Hello!"
}
は、その後のテストは、右隣newpackage.go
からnewpackage_test.go
に行きます。これらはPythonに慣れていて、Test *関数をたくさん書いてください。 Pythonと異なり、アサーションは使用されません。
$ cat ~/go/src/github.com/schwern/newpackage/newpackage_test.go
package newpackage_test
import(
"testing"
"github.com/schwern/newpackage"
)
func TestMyNewFunc(t *testing.T) {
want := "Hello!"
have := newpackage.MyNewFunc()
if have != want {
t.Errorf("MyNewFunc(): have: '%v', want: '%v'", have, want)
}
}
あなたがパッケージディレクトリ内go test
を実行した場合には、現在のパッケージとその依存関係をコンパイルパッケージディレクトリ内のすべての*_test.go
ファイルを検索し、コンパイルし、そのTest*
機能を実行します。
$ pwd
/Users/schwern/go/src/github.com/schwern/newpackage
$ go test -v
=== RUN TestMyNewFunc
--- PASS: TestMyNewFunc (0.00s)
PASS
ok github.com/schwern/newpackage 0.013s
このテストは、テストとは異なるパッケージになっています。それはブラックボックステストになり、エクスポートされた(つまりUpperCase)関数しか見ることができません。テストを同じパッケージに入れることでグラスボックステストを行うことができます。newpackage_internal_test.go
のような別のファイルでテストするのが最善です。
残念なことにGoにアサーション関数が付属していないため、上記のif
とt.Errorf
の呼び出しは同等です。常にハンドロールするのではなく、stvp/assertのようなアサート機能を提供するライブラリがあります。 go get github.com/stvp/assert
を実行した後に書くことができます...
package newpackage_test
import(
"testing"
"github.com/schwern/newpackage"
"github.com/stvp/assert"
)
func TestMyNewFunc(t *testing.T) {
assert.Equal(t, newpackage.MyNewFunc(), "Hello!")
}
あなたがnewpackage
を使用して実行したい場合、それはおそらく、独自のパッケージに行く必要があります。それがnewpackage
の不可欠な部分でない限り。
$ cat ~/go/src/github.com/schwern/newexec/main.go
package main
import (
"fmt"
"github.com/schwern/newpackage"
)
func main() {
fmt.Println(newpackage.MyNewFunc())
}
私は、私は完全にそれを理解していない認めるのに... main
、the testing
package provides a special TestMain
functionをテストしたい場合。他の言語と同様に、できるだけ多くの機能をライブラリ呼び出しに入れ、main
を薄いラッパーにすることが最善です。
はい、あります:https://golang.org/cmd/go/#hdr-Test_packagesとhttps://golang.org/pkg/testing/ – Volker
を読んでください。他のパッケージからメインパッケージをインポートするのは変です。このようなシナリオを持つ理由を教えてください。 – Heissenberger
あなたは何を意味するのか分かりません。私はメインパッケージをインポートしようとしていません。私はPythonの 'if __name__ ==" __main __ ":'と同等のものがあるかどうか疑問に思っていました。これはテストファイルを書くことなくモジュール内の個々の関数を試すことができます。 https://stackoverflow.com/a/4041260/5319281 – AppTest