なぜソフトウェア開発でテストが重要なのか?~駆け出しエンジニア向け~
はじめに
ソフトウェア開発において大切なテスト。
私が改めて言語化しなくとも、ソフトウェア開発において、テストの重要性は十分認知されています。
ただ、それは一定程度開発の経験を積んだ人たちだと思います。
これからエンジニアになる人、エンジニアになったばかりの人は、テストが大事とよく見るけれど、テストとは何なのだろうか?なぜ大事なのだろうか?と思ったりするのではないでしょうか。
(私も最初はそうでした)
この記事では、これまでのソフトウェア開発の経験をもとに、なぜテストが不可欠なのか自分なりに言語化してみました。
また、テストスキルの身につけ方についても、一つの意見として記述しました。
テスト=品質保証と信頼性の確保
テストとは、特定の入力に対して、処理の結果、期待した出力がされることを検証・確認する作業のことです。
テストを作る一番の目的は、バグを早期に発見し、ソフトウェアの品質を保証することです。これにより、ユーザーに対して安定した信頼性の高いソフトウェアを提供することができます。
新機能を開発していたら、既存の機能と整合性がとれず、前の機能が使えなくなることはよくあります(いわゆる、デグレ)。
デグレをリリース前に防ぐためにも、テストは大切です。
ただ、機能が増えるたびにテストをするとなると、テストすべき項目はどんどん増えていきます。
もしテストを手動でやっていたらどうなることでしょうか?
開発よりもテストをする時間の方が雪だるま式に増えてしまい、どんどんリリースのリードタイムが長くなってしまいます。
自動テスト
これを解決するために、テストを自動化(ソフトウェア化)することが大切です。
しかし、これをするために何か新しいモノを開発する必要はありません。各プログラム言語でデファクト的なテストフレームワークがありますので、それを利用しましょう。
(JavaScript/Node.jsやTypeScriptだとJestなど)
https://jestjs.io/ja/
自動テストを導入することで、少しメソッドの処理を変更したときや条件分を変えたときにも、必要なテストを実行することができます。これにより、新たなバグを早期に発見することができ、品質確保および開発スピードを維持することができます。
継続的テスト
また、自動テストは、開発時だけでなく、それ以外の場面でも役立ちます。よくある使い方としては、コードを開発環境や本番環境にデプロイするときや、定期的に自動テストを実行させます。開発フローの各ポイントにテストを導入することで、バグの波及を早期に防ぎます。
テストスキルの身につけ方
最初の一歩
テストで何を検証すべきか考えられるようにしましょう。検証する項目は、その機能の処理の目的によってケースバイケースです。例えば、出力が特定の値になることを検証するのか、特定のプロパティを持っていることなのか。
テストフレームワークを使って、上記を表現する方法を学びましょう。なかには、自分がやりたいことがメソッドとして用意されていない場も出てきます。どういったテストに変換すれば良いか考えられるようにしましょう。
中級者~
取り組んでいる開発に必要なテスト群は何なのか設計できるようになりましょう。テストで確認したいことはたくさんありますが、無限にテストを作ることはできません。また、処理的に重複したテストを書いても非効率になってしまします。
(例えば、y = 3xみたいな処理があったときに、x=1のときはy=3, x=2のときはy=6となる確認。どちらか一つで良い)
また、上記を言い換えたものかもしれませんが、テストで検証される項目はそのソフトウェアの仕様と同じです。
(個人的にはテストとは?に対してこれを主張したい)
そのコードではなにが達成されれば機能要件が満たされるのか?(エラー処理も含む)ということになります。
テストしやすいコードの書き方を実践しましょう。
単体テスト、結合テスト、e2eテストなどのテストの種類を理解し、必要なテストを作れるようにしましょう。e2eテストには、追加のテストフレームワークを導入する必要があることが多いです。
テスト駆動開発(参考図書)の概念を理解し、必要に応じて、取り入れていきましょう。
まとめ
テストは、ソフトウェア開発において欠かせない要素です。機能開発のコーディングとは別にテスト独自の概念や言葉、フレームワークを覚える必要がでてきますが、一度覚えると開発効率が上がることは間違いありません。