ユニットテストについて ―なぜユニットテストを書くか?

はじめまして。株式会社i-plugでOfferBoxの開発をしております中井と申します。

早速ですが、今回はユニットテストについて、なぜテストが必要かと、メリット・デメリットについて簡単にご紹介できればと思います。

ユニットテストとは?

ソフトウェアテストの一種です。
ソフトウェアテストにもいろいろありますが、

などのうち、単体テストにあたる部分です。
プログラムのあるクラス・あるメソッドが、期待どおりの振る舞いをするかを検証・保証することが目的です。

なぜユニットテストを書くか?

ユニットテストを書くことで、特に大きなコードベースに対しては様々な恩恵があります。

デグレを防げる

チーム開発では、Gitのコンフリクトは日常的に発生します。このとき、コンフリクトの修正を間違えてデグレデグレード、プログラムが以前の状態に戻ってしまうこと)させてしまうことが恐ろしいですが、テストでカバーできていればデグレを未然に防げる可能性が高まります。

早い段階で不具合をキャッチできる

テストコードが適切に書かれていれば、どのメソッドでどのようなエラーが起きているかをいち早く知ることができます。

PHPなど実行時にコードが解釈されるプログラミング言語の場合、実際に実行するまでエラーが起きるかわからないため、リリースして実際に画面を触ってから不具合に気づくことも多いです。テストでカバーできていれば、不具合があるままリリースしてしまう確率を減らすことができます。

リファクタリングできる

テストコードでは、たとえばあるメソッドに対するパラメータ(引数)と戻り値の組み合わせが正しいかが検証されますが、このとき内部の実装の検証までは行わないことがほとんどです。そのため、テストが通る限りは、内部の実装を変更することができます。

ユニットテストが向かないケース

一方で、テストを書くことによるデメリットもあります。

テストを書く時間がかかる

テストコードが書かれない理由の一つにこれがあるかと思います。
ただし、後で思わぬ不具合の対応をする時間が発生することを考えると、中長期的に見れば損失になりにくい、と考えます。

寿命の短いコードの場合は恩恵が少ない

プロトタイプのような作ってすぐ壊すタイプのコードや、ごく短期的に使うコードの場合などは、テストでコードを保護するよりも早くリリースして検証した方が良いこともあります。

大量のデータが必要な場合、データが用意しづらい・テストが書きづらい

例えばDBと連携したテストの場合、複雑なデータの組み合わせをテストすることは難しいことが多いです。 ただし、このケースはユニットテストではなくファンクショナルテストとして、別の方法でテストを書くこともあります。

弊社では、DBと連携する箇所があれば簡単なテストはユニットテストとして書き、複雑なデータが必要な場合などは別途チェックリストなどを作って確認することが多いです。

まとめ

ユニットテストの必要性、メリット・デメリットについてご紹介しました。 また後日、どのようにテストを書いているかや、テストを使ったリファクタリングなどについてお伝えできればと思います。

今後もOfferBoxの開発に関する様々な情報を発信していく予定です!
どうぞよろしくお願いします。