サブディレクトリのGolangテスト


120

ワークスペースをよりクリーンに保つために、サブディレクトリとしてパッケージのテストと例を含むパッケージをGoで作成したいと考えています。これは可能ですか?可能な場合、どのようにですか?

すべてのドキュメントでは常にテストコードを他のコードと同じ場所に配置していますが、これは何らかの方法で、または単に慣例の方が優れていますか?


5
注:go test ./...現在のフォルダーすべてのサブフォルダーでテストを実行します。以下の私の回答を
VonC '12


私も同じことを考えていました。同じレベルのダイレクターにサブディレクトリがあるため、個別のディレクトリにテストを置くのに問題があります。
filthy_wizard 2016

回答:


201

「再帰的に」実行できることに注意してください。テストするすべてのパッケージgo testリストする必要があります

Goプロジェクトのルートフォルダーにいる場合は、次のように入力します。

go test ./...

./...」表記については、「コマンド」の「パッケージリストの説明」セクションで説明していますgo

インポートパスには...、空の文字列やスラッシュを含む文字列を含む任意の文字列に一致する" "ワイルドカードが1つ以上含まれている場合、パターンになります。

このようなパターンはGOPATH、名前がパターンに一致するツリー内にあるすべてのパッケージディレクトリに展開されます。

特殊なケースとして、のサブディレクトリと同様にx/...一致xしますx
たとえば、サブディレクトリにnet/...展開しnetてパッケージ化します。


あなたが続ける場合は_test.go、サブフォルダ内のファイルを、「go test ./...」コマンドは、それらを拾うことができるようになります。
だが:

  • テストファイルがパッケージのエクスポートされたコンテンツにアクセスできるようにするには、エクスポートされた変数と関数(テストで使用される)の前にパッケージの名前を付ける必要があります。
  • エクスポートされていないコンテンツにはアクセスしません。

そうは言っ_test.goても、メインのソースファイルのすぐ横にファイルを置いておくことをお勧めします。


4
非公開のものへの非アクセスは通常のブラックボックステストであり、より優れていると主張する人もいます。パブリックシンボルを修飾する必要がある場合は、いつでも_ "..."をインポートできます。
ddevienne、2015年

15

テストをコードと一緒に同じディレクトリのファイルと呼ばれるファイルに置きますfile_test.go。「file」はテストするソースコードファイルの名前です。これは慣習であり、私自身の経験ではこれが最良であることがわかりました。

go testツールが十分に自動化されていない場合は、従来のGoテストとGoConveyテスト(動作に基づいており、より自己文書化されている)だけでなく、従来のGoテストを自動的に更新して実行するWeb UIを備えたGoConveyを調べることもできます。従来のGoテストよりも)。


2
GoConveyは素晴らしいです(そして、私は高い期待を持つ新しいUIを待っています)。私は現在のプロジェクトでそれを使用しています(たとえばgithub.com/VonC/asciidocgo/blob/master/abstractNode_test.goなど)。ただし、go testサブフォルダでも機能します。以下の私の回答を
VonC '12

その通りその通り。実際、おそらくこの質問に対する私の回答よりも関連性があります。
マット

10

編集済み

VonCの答えに基づいて、

この回答はで有効ですgo1.11。上位goバージョンではまだテストされていません。

テストをサブフォルダに保存したいtest場合は、と言ってから実行します

go test ./...

テストを含まないものも含めて、すべてのフォルダーでテストを実行しようとする?ため、非テストフォルダーの後続のレポートにがあります。

ランニング

go test ./.../test

代わりに、testフォルダーのみを対象とするため、テストフォルダーのみに焦点を当てた明確なレポートが作成されます。

注意

テストサブフォルダを使用すると、カバレッジレポートの計算ができなくなることに注意してください。goの哲学は、テストファイルをパッケージフォルダーに残すことです。


1
私の5歳の答えに加えて、良いヒント。賛成
VonC、

親愛なるアンナ、何がうまくいかないのか説明してください?そして、あなたの行くバージョンは何ですか?あなたは何をしようとしているのですか?その後、この方法ではコードカバレッジの計算が許可されないことに気付きました。これはどういう意味ですか?
avi.elkharrat

1
go test ./.../testリターンはgo: warning: "./.../test" matched no packages//テストフォルダーをターゲットだけではありません。goバージョンgo1.13 darwin / amd64
アンナ

1
@ Madeo、golangはテストとコードの分離を促進しないため、これは意味のあることです。異常は以前のバージョンでそれを可能にすることでした。
avi.elkharrat

1
@ avi.elkharratそして実際、私はテストを別のパッケージ/フォルダーに保存したいと思っていたとしても、このアプローチをこれ以上実行しないことに決めました=(
Madeo

-4

通常はテストしませんが、ファイルをディレクトリにグループ化して、次のようにインポートすることができます

import "./models"if 1レベルout
import "../modelsif 1レベルout and one level in

たとえば、次の場合:
./models/todo.go
./test/todo_test.go

テストにtodo.goからtodo_test.go、であなたのインポートがtodo_test.go可能になります

import "../models"


コードをインポートするこの方法は、公開された関数に対してのみ機能します。明示的に同じパッケージに入れても、同じパッケージのようには動作しないようです。したがって、このソリューションは単体テストの問題を実際には解決しません。
優雅なペンギン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.