掛かっていていい感じですね!もちろん内容も良い!本記事では、Goのtestingパッケージについて書きます。既存記事を調べてみると、そこそこあるけどそこまで多くはない。重厚な記事もあればあっさりした記事もある。いうことで深すぎず浅すぎずを目指そうと思います。テストに関しては最初アサーションがないことに戸惑いましたが、慣れたらない方がよく感じてきました。執筆時点でのバージョンはgo1.13.4です。オプションでテスト対象を絞る共通処理のエラー箇所を分かりやすく出力する前処理/後処理をするその他おわりにもっともシンプルなテストGoでテストを実行するにはいくつかルールがあります。ファイル名は**_test.goとする関数はTestCamelCaseのようにTestではじめ後ろはCamelCaseとするtestingパッケージを引数で受けるテストファイルはテスト対象ファイルと同一パッケージとする(※テストだけ例外的にpackagename_testとすることも可能)そして下記のように期待値と実行時の値が違う場合はt.Errorfでエラーを記録します(後述しますが必ずしもt.Errorfである必要はありません)。4.018s-vオプションをつけることでより詳細な情報が見られます。0.005sパッケージ/ファイル単位でテスト対象を指定するパッケージ単位でテスト対象を指定するには以下のようにコマンドを使い分けます。testing_testing.goBenchmarkを取るtestingパッケージを使ってBenchmarkを取ることもできます。Benchmarkを取るには*testing.Bを使い、-benchオプションを指定して実行します。1.241s一部の処理だけBenchmarkを取るBenchmarkにはStartTimer()、StopTime()、ResetTimer()が用意されています。これらを利用して一部の処理だけピンポイントでベンチマークをとることもできます。}}重い処理は無視して先ほどと同じような結果となるベンチマークが取れました。14.274sExampleテストtestingパッケージには少し特殊なものとして出力をテストするExampleテスト機能があります。Exampleテストは**_test.go内で実行することができます。output:を利用します。helloと書くことでテストができます。helleに変えるとテストでエラーとなります。0.005s複数行出力した結果のテストも可能です。outputはその名の通りオーダーを無視して出力を検証してくれます。0.005sExampleテストはGoDocにも利用でき、下記のような命名規則があります。}GoDocのTypeのMethodに出る更に上記の単位で細かくExampleテストを分けて書きたい場合は_suffixのように小文字で記述します。}GoDocにExampleを出力してみる実際にどのようにGoDocに出るかイメージしにくいのでサンプルを作成して確認してみます。ここまではテストファイルしかなかったので、別途サンプル実装とテストを書いて実行してみました。Yamada}上記サンプルコードをGoDocに出力してみます。getしてからコマンドを実行しlocalhost:6060にアクセスします。Packagesにアクセスすると自分のパッケージ情報が見られます。localhost:6060にアクセスExample()はPackageに表示されるExampleNewPerson()はTypeに表示されるExamplePerson_GetFirstName()とExamplePerson_GetLastNameはfuncに表示されるカバレッジをとる上記サンプルにテストを追加しカバレッジをとってみます。カバレッジは-coverオプションで簡単にみることができます。ちなみにExampleテストだけでもカバレッジが出るようです。0.005sExampleテストだけだと中途半端感があるので通常のテストに変えてみます。好みもあると思いますがGolandやVSCodeの機能を使うと簡単にテストコードの枠組みが出力できるのでかなり楽にテストが作成できます。}}同じようにカバレッジが出せました。0.006sどこのコードをテストが通っているかを確認したい場合にはhtmlに変換して確認することももちろんできます。cover.htmlHTML出力結果テストをスキップする下記の例では--shortオプションと組み合わせて使っていますが、実行するとtesting.Short()がtrueとなりスキップされます。ショートモードではこのテストは実行不要だという時などに使います。0.005s似た用途のメソッドはtesingパッケージのTBインターフェースに定義されているのであげておきます。基本的にはErrorやErrorfを使うことが多いと思います。boolテストがスキップかをチェックするサブテストとサブベンチマーク1つのテスト関数にサブテストを追加して複数のテストを実行することができます。ベンチマークも同様に可能です。"finished")は呼ばれないのでteardown処理を入れることも可能です。0.005sサブテストをパラレルに実行するサブテスト内でt.Parallel()を呼び出すことでサブテストをパラレルに実行することができます。パラレル動作を確認する為にA-1テストにだけSleepを入れて実行してみます。teardown}実行結果を見てみるとA-1のテストが最後まで残りfinishedが呼ばれているのが分かります。パラレルテストでも全てのテストが終わるまでfinishedが呼ばれないのでteardown処理をすることができます。2.009s-runオプションでテスト対象を絞る-runオプションを指定することでテストファイル内のテスト対象を絞ることができます。/A=1下記を実行するとFoo/A=にマッチするテストだけ実行されてるのが分かります。0.005s共通処理のエラー箇所を分かりやすく出力するちょっとしたことですが、テストで共通処理を呼び出している時、どのテストでエラーが出たかは共通処理のコード情報しか出力されないので通常だと分かりません。いう時はhelper()を使うと呼び出し元のテスト情報を出力してくれます。エラーとなるPreTest関数を複数のテスト関数で呼び出して実行して確認してみます。TとBはtestingのTBのインターフェースを実装(正確にはcommonが実装してそれを両方とも持っている)しているので*testing.Tも*testing.Bも渡すことができます。}}通常だとPreTestのエラー箇所である行情報しかでませんが、t.Helper()のコメントアウトを外してもう一回実行してみます。finished呼び出し元のテスト側の行情報がでるようになりました。2.009s前処理/後処理をする*testing.Mを利用すると、対象のテストに対して「前処理」や「後処理」を書くことができます。テスト対象ファイルに下記のように記述することで実行が可能です。上記の--runオプションで対象テストを絞っても「前処理」と」後処理」は実行されます。println("後処理")}テストの最初と最後に「前処理」と「後処理」がプリントされました。(cached)その他testingパッケージには他にもioテストをしやすくする為のiotestパッケージや、ブラックボックステスト用であるquickパッケージ(ただし凍結されている模様)があります。おわりにGoは標準でモックライブラリも用意しているので組み合わせれば標準でほとんどのテストができます。httptestもあるのでe2eテストもできます。これらをうまく使いこなして楽しい開発ライフを送りたいと思います。余談ですが、本記事を書くにあたりGoDocをいろいろみていたら気になる箇所があったのでGo本体にコミット&レビュー依頼してみたところ、何度かやりとりした後、無事取り込んでくれました。GitHubではなくGerritを使っているので最初のセットアップは少し面倒ですが、一度セットアップすると以降は簡単にレビュー依頼をすることができます。下記の本家記事と日本語の記事がとても分かりやすいので是非参考にしてみてください。「テックの力を最大化する」をミッションに掲げ、ヒトとテクノロジーの架け橋となるサービスを提供します。upLoginユーザーは見つかりませんでした。