HDE Advent Calendar 2015

HDE Advent Calendar Day 23: Golang実装のクラウドサービスとMock

こんにちは、クラウドプロダクト開発部の篠原です。

昨年の私は背骨を折る大怪我をしてしまい散々でしたが、今年一年は健康に働けました。健康って大事ですね。それもこれも、昨年のアドベントカレンダーで取り上げたバランスボールのおかげだと思っております。みなさん、バランスボール座ってますか?

さて、今年1年は私にとってGolangの年でした。 Gopher

昨年の暮れからGolang実装のクラウドサービスを開発するプロジェクトにジョインし、日本のGolang ConferenceでGolangの父 Rob Pike先生とお酒を呑み、インドで開催されたGopherCon Indiaに参加 (Go 旋風はインドまで! ー GopherCon India 2015)してGolangコミッタのDave Cheneyさんにエアポートでチェックインのヘルプをしてもらったり、会社にはいつの間にか牧さんがジョインしていたりと、なにかとGolangと縁のある日々でした。

ということで、今年のアドベントカレンダーはバランスボールから一転、私がプロジェクトにジョインして得たGolangに関するTipsでも書こうと思います。

クラウドサービスとモック

私が開発しているサービスはGolang実装のクラウドサービスで、80を超えるパッケージ / 5万を超えるラインと、Golangにしてはわりと大きめなコードです。

わりと大きめなコードですが、実はコードの約半分はテストコードです。そのテストで必要とされるのがMockです。Mockは、主にテストの実行準備が大変なネットワークを経由するような機能を置き換える形で利用しています。開発しているサービスはネットワーク経由が基本であるクラウド上での運用を想定しているため、Mockの数が多くなりがちです。また、チームの開発スタイルが1パッケージを1人が担当しているため、パッケージAで使われるパッケージBの機能のMockはパッケージAの開発者が自分勝手に作成している状態でした。

オレオレMock問題

つまり、自分勝手な各パッケージの機能のMockが重複して実装されていた訳です。そのため、パッケージBの機能の仕様が変更されても、パッケージAではパッケージBの機能を勝手に想像したMockを実装しているので、パッケージBの仕様変更を検知できずテストが成功してしまう問題が発生してしまいました。

とりあえず、自分勝手にオレオレMock問題と名付けてみました。

自分のMockは自分で管理

上記の問題に対して、まず各パッケージは自分のMockを管理するように変更し、重複しているコードを削除しました。よく使われるようなパッケージは、テストはもちろん必要ですが、テストに加えてMockも作成する必要があると感じました。

go-mockによるMock自動生成

Golangではgo-mockというインターフェースを参照して、Mockを自動作成してくれるライブラリがあります。以下のコマンドでMockを自動生成できます。

# mockgen -source=foo.go

Mockを自動生成することで、本質的なコードの実装に時間を割くことができますし、Mockにバグが混入することも避けることができます。go-mockを使うことで、ちょっと幸せになれました。

ただし、Mockを作らず実際の環境でテストすることが一番です。例えば、Mockを使用しないインテグレーションテストの導入も一つの方法ですが、テストの実行に時間がかかる傾向にあるため、基本的な正常系のテストはインテグレーションテストでチェックし、細かな正常系のテストや異常系のテストはMockを使用するユニットテストで確認することをお勧めします。

Golangのエコシステム、go generate

Golangには、開発を楽にしてくれるたくさんのエコシステムがあります。その中のひとつに go generate があります。

go generate は、Golang1.4から導入されたツールで、Golangソースコード内の特別なコメントをスキャンし、コードを自動生成したりできるツールです。

上記のgo-mockを実行するために以下のコメントをMockを作成したいコードのファイルに挿入するとより幸せになれます。

go:generate mockgen -package PACKAGE_NAME -source SOURCE_FILE -destination MOCK_FILE

あとは、go generateを実行するだけで、Mockを作成したいコードのMockを自動生成しくれます。

このように、言語側から開発を支援してくれる仕組みを提供してくれているのがGolangの特徴であり、私がGolangを好きな理由のひとつです。

まとめ

以上、非常に簡単ではありましたが、GolangでMockするときのTipsを紹介させてもらいました。

  • クラウドサービスはMockが多い
  • 各パッケージで自分のMockを管理する
  • Mockはgo-mockで自動作成しよう
  • go-mockの実行はgo generateでお手軽に

あとがき

HDE Advent Calendar 2015もいよいよ残すところあと2日です。これまで個性的なHDEらしい記事がたくさんありましたね。私からは、ちょっとだけ技術的な記事を書かせて頂きました。一応、HDEは業界シェアNo.1のクラウドセキュリティ HDE Oneなどクラウドサービスを開発/運営している会社です。この記事でHDEは技術の会社であることを認識して頂いたら幸いです。

HDEではソフトウェアエンジニア向けインターンシップ海外出張かばん持ちインターンシップとお得で面白い企画もご用意してますので、HDEに興味を持って頂いた方は是非応募してみてください。

では、また来年!