web-dev-qa-db-ja.com

go(golang)でエクスポートされていない(プライベート)関数をテストする方法は?

Goで「非エクスポート(プライベート)関数」のユニットテストを作成することに興味がありました。ただし、ユニットを「公開」する必要があるため、テストパッケージでユニットテストを作成するのは基本的に非常に困難です。最終的には、それらがプライベートであるという点全体を無効にします。ポイントは、これらのヘルパー関数がモジュール化に役立つことであり、モジュール化されたため、テストパッケージ以外のすべてのユーザーが使用できるようにせずに単体テストを作成できるのは良いことです。テストスイートまたは実際のパッケージ自体を除く他のユーザーが使用します。

助言がありますか? only独自のパッケージと1つの追加パッケージまたはそのようなものにエクスポートすることは可能ですか?

40
Charlie Parker

パッケージ内にテストファイルを作成する

library_test.go

package mypkg

func TestPrivateStruct(t *testing.T){
  pf := private{ "Private Field" }
  ....
}

library.go

package mypkg

type private struct {
  privateField string
}

go test mypkg -vは、プライベート構造体でテストを実行します

44
fabrizioM

まず、内部テスト用のパッケージ名(たとえばmypkg)を使用し、同じものを使用して、パッケージと同じ場所に両方のタイプのテストを作成できます。 「外部」テストに「_test」が追加されたパッケージ名(例:mypkg_test)両方のタイプのテストは、名前が「_test.go」で終わるファイルに存在する必要があります。

しかし、単体テストのポイントは、パッケージへの「外部インターフェイス」(つまり、パブリック関数)をテストすることです。つまり、ユニットテストは常に「ホワイトボックス」テストである必要があります( ホワイトボックステスト を参照)。そうすれば、コードをリファクタリングでき、テストは中断しません。

もちろん、内部整合性をチェックしたい場合がありますが、これは「外部インターフェース」では不可能です。そのために、アサーションは非常に貴重であることがわかりました。別の可能性としては、パブリックな「診断」機能を、通常の使用ではないことを示す名前で追加することです。

6