見出し画像

もっとラクにテストを書く!普段お世話になっているGoland活用法を紹介します

こんにちは!
プラットフォーム開発1チームでバックエンドエンジニアをしている、むらってぃー(@canon1ky)です。

最近はモンハンライズにハマっています。
ティガレックス相手に居合抜刀気刃斬りの練習をしていて、ようやく安定して打つことができるようになってきました!

始めに

私たちのチームではGoを使って、店舗側のプロダクトを作っています。
その開発において、ユニットテストを書きながらの開発しています。

私は1年ほど前から本格的にGoを触り始め、エディタとしてGolandを愛用しています。
いまやテスト周辺の機能は欠かせないものとなっており、「あまり時間をかけずにテスト駆動の開発をする」という文脈において、非常に助けられています。

今回は普段テストを書く際に使っている、Golandの活用法をいくつか紹介します。
Goland公式のリンクを貼りつつこの場で軽くお話しをするので、本記事をきっかけとしてより詳細な情報を知りたい方は、そちらのページから調べてみてください!

注意書き

今回はmacOSを使っている前提で話します。
Golandだけでなく、IntelliJ使っている方も読んでみてください。
すでに知っている!という方は、この記事を読み飛ばしてモンハンを買いましょう。

例題

今回は下記の関数をテストします。

package example
// ユニークな値を持つスライス
type UniqIntSlice struct {
	uniqValues []int
}

// 引数のvaluesスライスから、ユニークな値のsliceを生成する
func NewUniqueIntSlice(values []int) UniqIntSlice {
	m := make(map[int]interface{})
	var uniq []int
	for _, v := range values {
		if _, ok := m[v]; !ok {
			m[v] = struct{}{}
			uniq = append(uniq, v)
		}
	}
	return UniqIntSlice{
		uniqValues: uniq,
	}
}

この NewUniqueIntSlice 関数に対して、下記のテストをしたいとしましょう。

・引数に [1, 2, 2, 3] を入れると、 [1, 2, 3] を持つUniqueIntSliceが返る
・引数に [1, 2, 3] を入れると、 [1, 2, 3] を持つUniqueIntSliceが返る
・引数に [2] を入れると、[2] を持つUniqueIntSliceが返る

それでは、この例題を使って、Golandで推したい機能と活用法の紹介をします!

まずはテストコード自動生成

これは私がGoland使いたてのころ、 ブランチ運用のお話 をされていたカピバラさんが「こんなことできるんですよ〜」と教えてくれたものでした!
私はそれまで毎回手でゼロからテストコードを書いていたので、この時の感動は映画コー○ブルーを見たときくらいのそれでした。

下記のように、テストコードを生成したい関数名の上で shift + command + T を押すと、「Test for function」というコマンドが見つかります。

画像1

そちらをクリックすると、バンッ!とテストコードが自動生成されるんですね。

画像2

いかがでしょう?
テスト本体となる関数名の定義や、アサーション部分をまったく記述せずにテストが走る状態となりました。

TableTestのテストコードが自動生成されるので、ほかのオブジェクトに依存しない関数なんかだと、 入力と出力を定義するだけの本質的な部分 に時間を割くことができます。
入力を加工して出力するだけのメソッドとかであれば、本当に一瞬でユニットテストでの動作確認まで終わります。

しかし、テストしたい内容次第ではアサーション部分などをある程度書き換えなければいけない場合もあります。
そのため「普段テストを書く上での負担を減らしてくれる」という立ち位置で考えるのが良さそうです。

より詳細な情報は 公式ページのこちら にあります。

自動生成しておくとさらに良いことが

テストコードを自動生成しておくと、テストコード内のどこでも良いので shift + command + T を入力することで、テスト対象の関数に移動できます。
それから、テストコードに戻りたい時はテスト対象の関数のどこでも良いので shift + command + T を入力することで、その関数のテストコードに移動できます。

テストコードを自動生成しておくことでこういったメリットも受けられます!
「関数直して、テスト直して...」といった感じで、テスト対象関数とテストを行ったり来たりするときに非常に重宝します。

テストケース用の構造体も自動生成してしまおう

テストケースの中に {} を追加し、その中で option + enter を入力します。

画像3

そこで出てくる、 「fill all fields」というコマンドを選択。 すると、こんな感じでテストケース用の構造体が自動生成されます。

画像4

あとは、必要なところだけ埋めていきましょう。

画像5

これで1テストケースできました。

テスト関数横のRunボタンをクリックしてテストを実行させましょう。
今回のケースはPassしました!

画像6

ちなみにこの「fill all fields」コマンドは、以前 Datadogのお話 をされていた赤嶺さんから教えていただいたもので、構造体の中身を定義するときの補完機能として使えるものです。

テストケース追加からのReRun

次は、テストケースを追加して、先ほどと同じテストを走らせましょう。
まずはテストケースを追加します。

画像7

さて、ここでテストをもう一度走らせたいです。
もう一度Runボタンにカーソルを持っていこうとしたあなた!ストップ!

直前に走らせたテストを実行させたい場合は、 ctrl + r ショートカットキーを入力することですぐに実行できます。
このコマンドのおかげで、1つテストケースを追加してテスト走らせて、またテストケース追加してということがラクにできました!

ちなみに、より詳細な説明は 公式ページのこちら にあります。

さいごに

今回は私がテストを書く際に使用している、Golandの活用法を紹介しました。
ユニットテストは即座に動作確認をできるほか、同じ関数を後に変更するチームメンバーや、数ヵ月後の自分を助けてくれるものではないでしょうか。 使われたことのない方、良ければ試してみてください!

本記事が少しでも誰かの開発効率UPにつながると幸いです。
また、ほかにも良さそうな活用法があれば、ぜひ教えてください!

Showcase Gigで急成長するプロダクトを一緒に作る仲間を募集しています。
興味を持ってくださったら、一緒にプロダクト開発しましょう!


この記事が気に入ったらサポートをしてみませんか?