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