はじめに
こんにちは、プラットフォーム開発部の@cw-hirataです。現在は新規登録画面やChatWork API管理画面といったあたりのサーバサイドのPHPプログラムを開発しています。
今日はChatWork Advent Calendar 2017の16日目のエントリーとして、私がChatWorkにジョインしてからユニットテストに深く触れ合うようになり、得られた恩恵についてお話したいと思います。
前職とユニットテスト
私は大学を卒業する2年前からChatWorkにジョインした2017年夏までの約7年に渡り、都内の別のベンチャー企業で主にインフラエンジニアとして勤務していました。その為コードを書く機会自体が少なく、ユニットテストと出会ったのはだいぶ遅い、大学を卒業してから間もない勤務開始3年目頃のことでした。
当時勤務していたベンチャー企業では、それまでのスピード重視のコードからの脱却が標榜されました。そしてその一環で新規プロダクトでは念入りな結合テストと共にユニットテストの導入を進める事になり、PHPエンジニアと共にインフラエンジニアの私もPHPUnitについて触れるようになりました。
しかし案件数が多くユニットテスト実装への工数確保が難しくなったことやユニットテストの恩恵を得られやすい大規模案件が少ないこともあり、次第に社内でユニットテストは放棄され、私も必要がなければユニットテストの準備をしないようになりました。
そしてその頃から「PHPUnit=大変なヤツ=コスパ悪い」という先入観が長いこと私の脳内に住み着くようになりました。
ChatWorkとユニットテスト
チャットワークの巨大なシステムを開発・保守するにはユニットテストが不可欠で、PHPのコードについては前職同様PHPUnitを用いています。
ChatWorkにジョインした2017年の夏以降、私はその「大変なヤツ」に再度相まみえることとなりました。そしてチャットワークのテストケースを見た私は、やはり「うわぁやっぱり大変なヤツ」という一言に尽きる状態でした。
しかし入社して間もなく任されたOAuth2 APIの管理画面の開発プロジェクトにおいて、私はユニットテストによるいくつかの恩恵を受けました。そして、その認識が一転しました。
「PHPUnit?コスパ悪い大変なヤツやん」から、「PHPUnitさん、ええやつやん!!!」に。
ユニットテストから得られた恩恵
恩恵その1 誤実装が減った
「引数が○○であれば××になる(正常系)」「引数が△△であれば例外を投げる(異常系)」etc.と色々な結果を返すメソッドが複数あるようなクラスを作る時、いつしか自分でどこをどう変えたのかわからなくなる事があります。
それにより一度実装した部分を再度誤実装し、バグったままコミットした後に結合テストで発覚してまたやり直す・・・という無駄なループを前職では何度も経験しました。
ユニットテストを書いておけばそれらを自動でボタン一つで一斉に実行できるので、制作時のテスト工数自体短くなり、それにより誤実装にも早い段階で自動的に気づけるようになりました。
恩恵その2 実装速度が上がった
誤実装が減るというのはもちろんですが、新しく着手した時の実装速度も変化しました。
いくつもの想定されるテストケースをボタン一つで何度も実行できると、新規に実装する時の効率も大幅に向上します。
恩恵その3 不安が減った
前職時代は「あれ?これちゃんと動いてるよな?この条件の時はこうなるから、大丈夫・・・なはず・・・やっぱ不安!」となり、延々と実装漏れや確認漏れに怯えながらテストを繰り返していました。
しかしユニットテストをちゃんと書けば、一定の工数でそれまで実装した部分を機械的に漏れなくテストができます。
不安に起因する無限ループが減ることで、工数だけでなく自分自身へのストレスが大幅に軽減されました。
まとめ
今では毎日phpunitコマンドを叩きながら開発をしていますが、この自分は半年前には想像していませんでした。
ユニットテストはコスパの悪い大変な存在ではありません。
ちょっとした投資で全体的な工数を圧縮してくれて、精神衛生まで保ってくれる素敵な存在です。ええやつです。
皆さんも機会と工数が許す限りユニットテストの恩恵を受けながら開発をしてみてはいかがでしょうか!