2017-06-08 3 views
1

Goのプログラムは、main関数を出発点として実行されることを理解しています。しかし、ワークフローが新しいパッケージのための関数を作成するためのものであると思っていました。Goでパッケージを作成するためのワークフロー

たとえば、私は__main__をモジュールが直接呼び出されたときに使用します。モジュールが別のファイルからインポートされると、__main__は無視されます。新しいモジュールを開発するときに便利です。 GOの

if __name__ == "__main__": 
    # Run module code here if module called directly 

私は私が作成していたパッケージに機能をテストするために、私のmain.goファイルと一緒にpackage mainとtest.goファイルを使用しています。

// test.go 
package main 

import (
    "newpackage" 
) 

func main() { 
    newpackage.MyNewFunc() 
} 

これを行うより良い方法はありますか、これは標準のワークフローですか?ありがとう。

+1

はい、あります:https://golang.org/cmd/go/#hdr-Test_packagesとhttps://golang.org/pkg/testing/ – Volker

+0

を読んでください。他のパッケージからメインパッケージをインポートするのは変です。このようなシナリオを持つ理由を教えてください。 – Heissenberger

+0

あなたは何を意味するのか分かりません。私はメインパッケージをインポートしようとしていません。私はPythonの 'if __name__ ==" __main __ ":'と同等のものがあるかどうか疑問に思っていました。これはテストファイルを書くことなくモジュール内の個々の関数を試すことができます。 https://stackoverflow.com/a/4041260/5319281 – AppTest

答えて

8

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にアサーション関数が付属していないため、上記のift.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()) 
} 

私は、私は完全にそれを理解していない認めるのに... mainthe testing package provides a special TestMain functionをテストしたい場合。他の言語と同様に、できるだけ多くの機能をライブラリ呼び出しに入れ、mainを薄いラッパーにすることが最善です。

関連する問題