Go 内でいくつかの異なるテスト パッケージ命名戦略を見てきましたが、それぞれの長所と短所は何か、どれを使用すべきかを知りたいと思いました。
戦略1:
ファイル名:github.com/user/myfunc.go
package myfunc
テストファイル名:github.com/user/myfunc_test.go
package myfunc
見るzip2 形式例えば。
戦略2:
ファイル名:github.com/user/myfunc.go
package myfunc
テストファイル名:github.com/user/myfunc_test.go
package myfunc_test
import (
"github.com/user/myfunc"
)
見るワイヤー例えば。
戦略3:
ファイル名:github.com/user/myfunc.go
package myfunc
テストファイル名:github.com/user/myfunc_test.go
package myfunc_test
import (
. "myfunc"
)
見る文字列例えば。
Go 標準ライブラリは、戦略 1 と 2 を組み合わせて使用しているようです。3 つのうちどれを使用すればよいでしょうか?package *_test
テスト パッケージに追加するのは面倒です。パッケージのプライベート メソッドをテストできないからです。しかし、私が気づいていない隠れた利点があるのかもしれません。
ベストアンサー1
package myfunc
あなたが挙げた3つの戦略の根本的な違いは、テストコードがテスト対象のコードと同じパッケージにあるかどうかです。テストファイルでを使用するか使用しないかの決定は、テストをpackage myfunc_test
実行するかどうかによって異なります。白い箱またはブラックボックステスト。
プロジェクトで両方の方法を使用することは問題ありません。たとえば、myfunc_whitebox_test.go
と を使用できますmyfunx_blackbox_test.go
。
テストコードパッケージの比較
- ブラックボックステスト:を使用
package myfunc_test
すると、エクスポートされた識別子。 - ホワイトボックステスト:エクスポートされていない識別子にアクセスできるようにするために使用します
package myfunc
。エクスポートされていない変数、関数、メソッドにアクセスする必要がある単体テストに適しています。
質問に記載されている戦略の比較
- 戦略1:ファイルは
myfunc_test.go
を使用しますpackage myfunc
— この場合、 のテスト コードはmyfunc_test.go
でテストされるコードmyfunc.go
(myfunc
この例では ) と同じパッケージ内にあります。 - 戦略2:ファイルでは、テストコードは「別のパッケージとしてコンパイルされ、メインのテストバイナリとリンクされて実行されます。」を
myfunc_test.go
使用します。[ソース:package myfunc_test
myfunc_test.go
テストソースコード] - 戦略3:ファイルは
myfunc_test.go
を使用しますpackage myfunc_test
が、 はmyfunc
ドット表記を使用してインポートします — これは戦略 2 のバリエーションですが、 をインポートするためにドット表記を使用しますmyfunc
。