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