SSブログ

テスト駆動開発プロジェクトの経験(5) [時の流れ]

前回からのつづき)

ソフトウェア開発におけるテストの自動化やテスト駆動開発などは、それほど古い訳ではなく、2000年以降に徐々に採用されてきています。そして、今も、自動テストを整備することなく、テストを手作業で行っているソフトウェア開発も多いと思います。

その意味で、社会人となって従事するソフトウェアプロジェクトが、テスト駆動開発になっているのか、手作業でテストを行う開発なのかは、ソフトウェアエンジニアのスキルとして大きなギャップを生み出すかもしれません。

テストファーストでの開発では、最初にAPIを考えることが求められます。たとえば、小さな機能であっても、その機能を提供するAPIをどうするかを最初に考えます。そして、それから、テストコードを作成し、テストが失敗することを確認します。そして、実装を始めるわけです。

特に、これにきちんとした防御的プログラミングとしてのパラメータ値の検査を行うことをAPIに明確に記述することで、そのためのテストも作成します。また、すべての機能をテストするためには、どのようなテストを作成すればよいかを悩みながら考えるわけです。

一方、手作業でテストする開発では、意外とありがちなのは、APIを考えるのですが、正常のパラメータしか渡ってことないという前提で実装を始めて、正常ケースだけを実装してしまうことです。そして、実装が終わったと思った後に、部分的なテストだけを書いて、実装が終了したと判断するわけです。

テストファーストによる開発は、本を読んだら身に付けられるかというと、そうではありません。テストファーストによるテスト駆動開発では、ソフトウェアエンジニアに対して多くのことをきちんと行うことが求められます。APIを考えて、テストを苦労して作成して、それから実装するということを意識して繰り返すことで、無意識に行えるようになるまで開発経験を積んで行く必要があります。そのような状態になって初めて、未経験者に対して指導ができるようになるわけです。

技術的な知識を学ぶのは、書籍を読んだり、ウェッブで調べたりすればできるのですが、ソフトウェア開発では、普段の行動パターンとして、求められることも多くあります(「ソフトウェア開発組織が持つべきカルチャー」)。そのような行動は、実際に自分で経験していく必要があります。

その意味で、最初からきちんとしたテスト駆動開発のプロジェクトとに従事すると、新人であっても様々なことをきちんと行うことが求められ、本人が意識しなくても、強制的に身に付くわけです。しかし、そのような開発でない場合は、数年、あるいは、10年以上もソフトウェア開発を経験して、中堅となっても、テスト駆動開発を推進できないし、しないソフトウェアエンジニアになってしまう可能性は高いです。

Jenkinsを導入していても、ビルドを自動化しているだけ、何もテスト書いていなければ、テスト駆動開発ではないわけです。その意味で、テスト駆動開発の経験を問われた時に、Jenkinsを導入したことがあるという回答では不十分であり、期待する答えではないわけです。