はじめに
株式会社ナイトレイの和田です。
普段、自社サービスの開発に取り組んでいます。
現在私が関わっているプロダクトにユニットテストを導入しました(そのプロダクトではユニットテストが省略されていました)。
その際に、改めてユニットテストのメリット・デメリットを学んだので、それをまとめたものをここに共有します。
メリット
①バグによるダメージを減らせる
早期発見
一般的に、不具合が発生した時の改修コストは、発見が遅れるほどに上がっていく。
例えば、リリース前に見つかるのとリリース後に見つかるでは改修の影響範囲やユーザーへの対応含め大きな差がある。逆に言えばQA段階ならもっとコストが下がり、手元での動作確認時ならさらに下がり、コードレビュー段階ならさらに…
テストコードは開発段階で不具合を発見することに貢献してくれるため、改修コストが最小で済む。
原因特定
テストコードが書かれていれば、どこが壊れてどこが正常なのかという問題の切り分けができるので、問題箇所の特定がしやすくなる。結果的に不具合の解消を早めることができる。
減少
コーナーケースを明示的にテストコードに落とすことで、バグの減少に繋がる。
境界値がバグ発生率が一番高い。
②疎結合なシステムに開発が進む
テストを設計することで、クラスやメソッドがテストしやすい形になり、自然と機能間の結合度を下げる効果を期待できる。
コードを単体テストするためには機能(クラスやメソッド)を役割ごとに分離し、DBなど外部システムから可能な限り切り離し、外から結果を確認できるようにする必要がある。
その結果、クラスやメソッド同士に余計な依存関係が生まれず、結合度が下がる。
結合度が下がるとシステムの保守性や拡張性も向上し、バグ修正や機能追加もしやすくなるというメリットがある。
③リファクタリングの促進
テストがあることによって、変更後も変更前と同じ動作をするかコードベースで簡単に検証ができるので、リファクタリングというアクションを起こしやすい。
もしテストがない場合、振る舞いが変わっていないことを保証できないため、開発者は思わぬバグを恐れ手をつけなくなってしまう。
④コードリーディングの効率を上げる
テストコードがあると、実際の使用例を見ることできるので、仕様やコードの役割への理解を助け、深めてくれる。
例えば、あるメソッドはマイナス値を許容するのか、最大値・最小値は存在するのか、どのような結果が返却されるのか、テストを読むことで理解することができる。
デメリット
①コストがかかる
最低でも書かない場合の2倍の工数は見積つもる必要がある。
テストを実施するにあたって、例えば以下の作業が発生する。
-
テストの準備
- テストに関する知識の習得
- テストをするにも一定量の知識とスキルが必要
- テストケースの作成
- 前提条件
- 手順
- 入力値
- 結果
- テストDBの用意
- 必要であれば作成する
- テストに関する知識の習得
- テストコードを書く
-
テストコードのメンテナンス
- テスト対象のコードが変更された場合、それに伴ってテストコードも修正しなければならない可能性がある
②テストの品質はスキル次第
テストの品質は、テスト実施者のスキルにより大きく左右する。
効果的なテストを実施するには、不具合が起こりやすい条件を想定したテストコードの作成やパラメーターの設定を行うことが重要となるが、それには一定以上のスキルが必要不可欠。
③費用対効果に見合わないケースがある
例えばチームやプロダクトが以下のような状態である場合、ユニットテストの効果が発揮しにくい
-
開発チームがあまりにも変動的
- テストコードのメンテナンスコストが高くなるため
-
プロトタイプのように寿命の少ないプロダクト
- ユニットテストは自動化され、何度も実行するからこそ、テストコードを書くコストが回収できる
- 1回だけテストを行うだけならば手動テストの方が効率がよい場合もある
-
リリースが長期スパン
- 手動テストのコストが相対的に小さくなるため、テストを自動化するメリットが小さくなる
参考
メリット
テストコードは必要か?(自動テスト・テスト駆動開発について考える)
「TDD」と「テストコード」。同じ“テスト”でも全然違います〜エンジニアが語る技術愛 #04〜
デメリット
単体テストとは?メリット・デメリットやテスト手法を詳しく解説
ユニットテストにまつわる10の勘違い
最後に
最後に
私たちの会社、ナイトレイでは一緒に自社開発のWebサービスを盛り上げてくれるエンジニアメンバーを募集しています!
基本的には直接ユーザーと接することのないポジションですが、セールス部門から
「顧客の声」を教えてもらったり、希望すればユーザーとのMTGに参加することも可能です。
モチベーションの高め方はあなた次第。
このような方は是非Wantedlyからお気軽にご連絡ください(もしくはこちらまで recruit@nightley.jp )
✔︎ 自社Webサービスの開発で事業の発展に携わってみたい
✔︎ 自分が開発したサービスで地域活性化に貢献したい
✔︎ 位置情報ビッグデータに興味があり、新しい活用方法を提案したい
✔︎ 地理や地図が好きで仕事中も眺めていたい
一つでも当てはまる方は是非こちらの記事をご覧ください
「受託開発一切なし!自社WEBサービスを社長やセールスチームと一緒に開発!」 https://www.wantedly.com/projects/467606
▼ナイトレイとは?