Code Polaris Advent Calendar 2020 19日目の記事です! Code Polarisは女性エンジニアのコミュニティで、普段は主にSlack上で交流しています。私は残念ながら都合が合わず、参加したことがないのですが、オンラインのもくもく会や勉強会も開催されています。 みんなでオープンソースのアプリケーションを開発してみるプロジェクトなどでわいわいやってます!

Code PolarisのSlackでときどき話題になる「ユニットテスト」周りについて。 なぜユニットテストは「書くべき」なのでしょうか?

まず、すべてのパターンを自動でテストすることでうっかりのバグを防ぐことができます。 自動テストは複雑な仕様変更時に威力を発揮します。内部の条件分岐がどのように変わったか、それによってin/outがどのように変わったかを全パターンもれなくテストするのは、手動では大変すぎるからです。 また、「テストが従前と変わらず通ること」によって、機能を壊していないことを証明しながら内部の実装を整理し直す(リファクタ)こともできます。

個人的にはテストしやすさを追求するとメンテしやすい設計を得られやすい点も重要だと思っています。 テストを助けに使ってメンテしやすい設計をする手法については、2019年のPHPカンファレンス北海道で発表した際のスライドにテクニックを紹介してあります。もし興味がある方は見てみてください。 https://speakerdeck.com/77web/tesutowozhu-kenishi-tuteshe-ji-wogai-shan-siyou-rihuakutaringukotohazime

さて、せっかく書いたテストを有効に活用していくために気をつけたほうが良いことが2点あります。

テストが通る状態を維持する

テストは全部通って当たり前という状態を維持できるようにすることです。

「割れ窓理論」としてTwitterでも時々話題になりますが、1つでも落ちるテストがあると、

  • 自分が新規に実装したコードにテストを書いていない
  • 自分が改修したコードによってテストが落ちるようになった

のようなときに、「自分だけじゃない、今回だけじゃないから別にいいや」という気分になりやすいです。
その結果、テストがないコードの割合、テストが落ちる状態のままメンテナンスされていないコードの割合がどんどん増えていき、せっかく書いたテストがいつの間にか活用されなくなってしまいます。

テストが落ちる=異常事態という意識を常に保ちましょう。 どんなに急いでいるときでも(急いでいるときほど)テストをちゃんと書き、通ることを確認してからマージ・リリースする癖を付けましょう。

テストの速度を維持する

気軽に全テスト実行できるように、テスト実行に関してある程度の速さを維持することも大切です。

想像してみてください。全テスト実行するのに24時間かかるとしたら、実行する気がなくなりますよね? 時間がかかりすぎると、コードを書いてすぐテスト実行する習慣がつかず、やはりテストが活用されなくなってしまいます。 テスト実行の所要時間が長いとCIプロバイダに払うお金も増大します。 テストをすぐ実行する習慣を維持するためにも、お金を節約するためにも、テスト実行時間が長くなりすぎないように注意しましょう。

もしも巨大なアプリケーションを開発していて、テストパターンもテスト対象機能も大量にある場合は、各機能ごとの単位でいつでもテスト実行できる体制を維持するために、パッケージ(レポジトリ)を分けることも検討してください。 私も1年前からチームメンバーと一緒にこのパッケージ分割に取り組んでおり、テスト実行時間に関しては大きな成果を得ています(SymfonyというPHPのフレームワークを使う場合に特化したテクニックの説明になっているため、他の言語・フレームワークの利用者の方にはわかりにくいかもしれません。ごめんなさい) https://speakerdeck.com/77web/an-yorisheng-maresihun-dun-falsemo-wang-wofeng-yin-surutameni-kurosurihuarensuniyorukaosunasymfonypuroziekutowokoreyi-shang-zuo-ranaihuo-dong-shi-jian-bao-gao

〜ここからちょっとPR〜

カルテット開発部は現在、バックエンドリードエンジニア(私)、フロントエンドリードエンジニアとも女性エンジニアが就いています。 現在育休中で来年復帰予定の女性エンジニアもいます :relaxed: 皆、バリバリ生き生きとコードを書いていますし、各種ミーティングでも自分の意見が言える職場です(むしろ女性の方が強い説があります…笑)。 残業がほとんどなく(ホントにないです)家庭や育児との両立もしやすい環境です。 私もパートタイムで入社して、子供の成長とともに正社員になりました :smile:

もしカルテット開発部に興味を持ってくれた女性エンジニアがいたら、Code Polaris SlackまたはTwitterにて私( @77web )にお気軽に問い合わせください。