はじめに
サイバーウェーブでエンジニアをしている保苅です。普段実務ではコーディングをしていて、最近はお客様からのお問い合わせ対応もしています。今回は、実務で初めてテストコードを書いたので勉強の際に注目すべきポイントや実務にテストコードを取り入れた感想をブログにします。
テーマ選びのきっかけ
サイバーウェーブへ入社してからの1年半、どの案件でも先輩エンジニアの下で開発してきました。ところがある日、社長である梨木さんに「これからテストコードを今まで以上に作っていくからその推進お願いしたい」と、テストコード推進のリーダーを任されました。
今まで、先輩エンジニアの下で開発してきた身でプロジェクトを先頭に立って推進できるか不安もありましたが、気持ちは新しいことへの挑戦という熱い思いでいっぱいでした。そんな背景もあって記事にするにあたって一番ホットなテーマを選びました。
サイバーウェーブでテストコードをさらに拡充させることになった背景
弊社代表の梨木さんにサイバーウェーブでテストコードをさらに充実させることになった背景について聞いたところ主にこのようなものがありました。
- VALUE KITの価値を高めるため
- VALUE KITの部品増加にともなう品質担保体制の強化
- セキュリティが特に重要視される決済系の導入保証
梨木さんはこう言いました。「テストコードをもっと充実させれば、今後のVALUE KITの部品拡大化やVALUE KITのよりコア(なかなか手を入れにくい)な部分に対して積極的にコードの変更ができるようになる。より社内のエンジニアが開発しやすいVALUE KITになる上に、よりお客様の求めるシステムを実現できるようになる」。
これらの背景があり、CWではいっそうテストコードの導入を推進していくことになりました。
テストコードを勉強してみて
まずは、プロジェクトで先行してテストコードを導入している箇所を読み、社内ではどんな感じでテストコードを書いているのかイメージを掴みました。実際にプロジェクトで使われているコードを見たことで「社内ではこんな感じでテストコードを書いているんだな」という所感や、「どうしてこういう書き方をしているんだろう?」などの疑問を持つことができました。
その後は、『Everyday Rails – RSpecによるRailsテスト入門』を読み進め、疑問を解消していきました。
(画像出典)Everyday Rails… Aaron Sumner 著 et al. [Leanpub PDF/iPad/Kindle]
Everyday Railsでは、実際に手を動かしながらプロジェクトでよく使う書き方や考え方を意識して読み進めていき、実務プロジェクトに簡単なテストコードを導入して検証を繰り返していきました。ここまでの学習で、RSpecの基礎的な構文やこういう便利な機能があるということが分かりました。
一方で、書籍を読んだ後も「システムテストとモデルテストはどのように使い分けるのか?」という疑問が残りました。
実務で学んだこと・振り返り
システムテストとモデルテストをどう使い分けるかという疑問は、実務の中で解消できました。
コードを書いているときに、「あれ、テストコード書くときって自分でロジックを組み立てるんだっけ?」という違和感がありました。梨木さんに相談したところ、「そこ、モデルテストじゃなくてシステムテストで書くんだよ!(笑)」と言われて、初めてその違和感の理由に気づきました。システムテストで書くべきコードを、モデルテストで書いてしまっていたのです。
システムテストとモデルテストは、次のような違いがあります。
システムテスト
コード内でブラウザ上の操作を再現し、期待する動作が行われるかを検証します。ユーザーがホーム画面のボタンをクリックしたら、商品一覧画面に遷移して、その後商品一覧画面で商品をクリックしたら、商品がカートに入るというような一連の流れをシステムテストで検証します。
モデルテスト
主にビジネスロジック等を記載したモデルクラス内のメソッドの動作を検証します。有効な属性で保存した場合は、モデルの状態が有効(valid)になっているかや、クラスメソッドとインスタンスメソッドが期待通りに動作するかなど、アプリケーションの基幹部分となるモデルが異常な動作をしないことを検証します。
テストコードも5分の1まで進んでいたのでシステムコードで書き直すのは辛い部分もありましたが、ようやくシステムテストで書くべきテストコードとモデルテストで書くべきテストコードを理解しました。
その他大変だったことは、ログイン後の処理をテストコードで実現することです。テストコードでログインをするコードを書こうとした時に、ログイン時にSMS認証を通すプログラムが書かれていました。最初は、そこをどうやって通すかを必死に考えていました。
ただ、ここで本来やりたかったことは、ログイン時のSMS認証が正しいことをテストするのではなく、ログインした後の処理をテストすることです。SMS認証に関してはテストコードを書く必要がなかったのです。そのため、SMS認証はモックアップ(試作品)を使って強制的に通すようにしたところ、無事テストコードでログインすることができました。
モックアップの使い方や、テストするところとそうでないところの切り分けが大事ということを学びました。
テストコード拡充の推進を担当して良かったことは、テストコードを使うべきかの判断基準を学べたことです。
実際に画面でユーザーが操作するものはシステムテストで、データやメソッドをテストするものはモデルテストで書くという使い分けや、システムテストはCapybaraでヘッドレスブラウザを立ち上げたり、JavaScriptを使う場面もあり処理が重いので、必要性が高い時のみテストコードを使うという判断ができるようになりました。
また、テストコードを実装してバグがある箇所を特定して修正したりとテストコードによる恩恵も実感することができました。
今後の課題
実務で感じた課題として、サイバーウェーブのテストコードを書く環境はまだまだ改善の余地があり、このような問題にあたって作業が止まることがよくありました。
- Capybaraで動かしているchromedriverのプロセスが切れておらず処理が重い
- データベースにロックが掛かりテストをやり直す手間がかかる
- ログイン時にTimeOutErrorになることがあり、状況によってSMS認証が通らない時がある
今後ストレスなくコードを書くためにも、これらの課題を解決していきたいです。今は、テストに必要な情報をGoogle SpreedSheetにコピーしてそのままコードに貼ればテストが実行されるような、自動テストの拡充にも挑戦しています。自動化できれば、今まで手動でテストしていたものがテストコード上で実行され、工数削減にもつながるので自動化する仕組みも積極的に考えて実現していきたいです。
サイバーウェーブでは一緒に働く仲間を募集しています
サイバーウェーブでは一緒に働く仲間を募集しています。当社は創業20年を機に「第2の創業期」として、事業を拡大方針へと舵を切りました。会社が急拡大しており、若いメンバーやインターン生がどんどん入社しています。個人の成長は、勢いのある環境のなかでこそ加速されるものです。成長事業に参画できるチャンスです!
サイバーウェーブはコード1行1行に対してこだわりを持って、プロ意識をもったエンジニアを育てている、技術力に自信のあるシステム開発会社です。社内には、創業23年のノウハウの詰まった研修コンテンツや、安定したシステム開発をするための手順が整っています。実力のあるシステム開発会社だからこそ、経験を積みながら、実践的なシステム開発の技術も学べます。自信をもって主義主張ができる『飯が食える』エンジニアを目指していただきます。
エンジニアとしてしっかりと飯を食べていけるまでには、道のりは決して短くありません。長期で頑張り、エンジニアになるという強い思いがあれば、実戦的な開発経験と、周りの仲間とコミュニケーションしながら、しっかりと成長できます。当社のノウハウを余すことなく活かし、技術力を大きく伸ばしていただきます。
ぜひ、エントリーをお待ちしております!