SIerに在籍する技術が好きな方は継続的インテグレーション(CI:Continuous Integration)を目指したくなるのではないでしょうか?
テストが自動化され、開発に集中できるため理想的に感じます。
一方で、SIの現場では下記の悩みに直面すると思います。
- なぜかテスト駆動開発が進まない
- テストファーストの文化が根付かない
それもそのはず。SEが活躍する現場ではテスト駆動開発と相性がとても悪いからです。
この記事ではSEとテスト駆動開発に関する導入への苦悩を紹介していきます。
テスト駆動開発へのアンチパターンを知ることで今後のプロジェクト推進の参考になることが多いでしょう。ぜひ最後までお読みください。
目次で流し読み
テスト駆動開発とは?
テスト駆動開発は先に実装すべき機能のテストコードを書き、そのテストを満たしていくようにプログミラングを進めるという開発スタイルです。
テスト駆動開発 (てすとくどうかいはつ、test-driven development; TDD) とは、プログラム開発手法の一種で、プログラムに必要な各機能について、最初にテストを書き(これをテストファーストと言う)、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる、という短い工程を繰り返すスタイルである。
プログラミングの実装から始めるのではなく、テストコードから書き始めるということです。
テストコードから実装することで、要件や引数・戻り値の仕様が明確となります。
さらに、テストコードにより品質が担保できるため、プログラムの修正や仕様追加などが起こったときのデグレもすぐに検知できるといったメリットも得られます。
テスト駆動開発のメリット
テスト駆動開発を行うことによる下記のようにメリットは多くあります。
- ゴール(テスト合格)に向かって開発が進められるため効率的である
- テスト可能なプログラムであることを保証する(メンテナンス性、堅牢性の向上)
- テストに合格されたコードであることを保証している
- テスト工程での成果物は、テストコードや合格のレポートを納品すれば良いため工数が削減される
- 積極的なリファクタリングを行いやすい
- 継続的インテグレーションが可能となる
順に紹介していきます。
ゴール(テスト合格)に向かって開発が進められるため効率的である
テストコードを記述すれば、あとは合格に向かって開発を進めるだけです。
テストを記述するのは大変ですが、先に記載することで仕様が明確になります。
さらに、テスト数が分かるため何件エラーで何件合格しているか?といった指標がそのままスケジュールとして利用できます。
プロジェクト管理をする側からすると、自動で集計できる指標となるためヒアリング時間が短縮し、リアルタイムで把握できるため効率的に運営できるといったメリットがあります。
テスト可能なプログラムであることを保証する(メンテナンス性、堅牢性の向上)
テストコードを先に記載することで検証しやすいコードとなります。
一つの関数で複数の処理を実施してしまい、メンテナンスしづらいコードを見かけたことは誰にでもあると思います。
このようなコードをテスト駆動開発を取り入れることで抑制することにつながりメンテナンス性の高いコードとなります。
テストに合格されたコードであることを保証している
テスト駆動開発では、テストコードを自動で実行ツールと組み合わします。
任意のタイミングで実行するのはもちろん、gitやsvnなどのリビジョン管理ツールへの登録時などのイベント時に実行も可能です。
テスト結果はシステムから通知されるため不合格であった場合は瞬時に把握できます。
そのため、不合格時にはgitにpushしないといった仕組みを整えることも可能で一定の品質を担保することが可能となります。
テスト工程での成果物は、テストコードや合格のレポートを納品すれば良いため工数が削減される
SIの現場では納品時に検証結果も納品物に含めることがあります。
検証項目にいつ、誰が検証し、結果がOKだったかNGだったかを記載する工数は大きくやる気も高まらないでしょう。
一方でテスト駆動開発を取り入れることにより、検証結果がシステム的に記録されるためレポートをそのまま納品することで完了となります。
工数が抑えられるため、開発費の削減につながるでしょう。
積極的なリファクタリングを行いやすい
大規模なシステムであったり歴史が古いシステムでは、プログラム修正によるデグレ(レベルダウン)が気になりリファクタリングは後回しにされがちです。
一度発生したコードの負債はいつまでも引き継がれる傾向にあります。
もしテスト駆動開発を導入していれば、コードを修正してテストを実行すればエラーとなるため瞬時に気づけ、デグレの抑制につながります。
継続的インテグレーションが可能となる
継続的インテグレーションとは開発者が修正後のプログラムをgitやsvnなどのバージョン管理に登録した後、自動的にビルド・テスト・リリースを行う仕組みのことです。
リリースのコストが下がるため、小さな修正も素早く本番環境に反映できます。
理想的な開発環境のため取り組むプロジェクトは多くありますが、ビルドやリリースは比較的かんたんに自動化できますがテストコードはすぐに用意できないため人手に頼るケースが多くなります。
そのため、テスト駆動開発を取り組むことにより継続的インテグレーションが容易に実施できるようになります。
テスト駆動開発をSIに導入した場合の効果
システム構築を請け負う場合、構築したシステムが拡張や改善を行うことは大規模プロジェクト以外あまりないでしょう。
すなわち、積極的なリファクタリングや継続的インテグレーションの必要性がないわけです。
また、数年後に発生する改修ではすでにプロジェクトメンバは解散しているばかりか別会社な可能性もあるわけです。
そのときの担当者がスキル不足である場合、テスト駆動開発を進める気もなければ環境構築もできないでしょう。
逆に技術スキルが高い場合は、網羅されたか否かわからないテストケースを実行して「すべてグリーンでした」となっても信じきれないでしょう。
そして何よりテストコードの流用性のことを考えると、テストコードを手間暇かけて書くよりExcelでテスト仕様書を作り、ひとつひとつテストをしたほうが早いというケースが大半なのではないでしょうか。
それらの将来的なことに目をつむって開発を進めても、開発工程における技術力の低さが課題となります。
通常、システム構築では下流工程ほど多くの人が必要になります。
上流工程はSIer社員で進め、開発工程以降は派遣や協力会社と進めますが正直、テスト駆動開発を進めるほどの技術力がないことが多いです。
職業訓練でJavaを勉強したレベルの人がいたり、すべてが受け身な人がいたり、おじちゃんがいたり。。
テスト仕様書も満足に設計できないそんな人に「テスト可能なプログラム」の重要性説いても響かないでしょう。
よくSEの技術力をバカにする人がいますが、私が見てきた現場では優秀なプログラマーは少ない印象です。
マッチングが失敗していますね。
まとめると、次のケースはテスト駆動開発が合わないと考えられるでしょう。
- システム納品後に拡張・改善がないプロジェクト
- テスト駆動開発の良さを享受できない文化
それでもSIerがテスト駆動開発を導入したらどうなるか?
そんな中、私が知っているSIでテスト駆動開発した事例を紹介いたします。
比較的おおきな案件(億単位)で、リリース後も保守・メンテ費用があったためテスト駆動開発を導入した事例がありました。
結果どうなったかというと、テストコードにはテスト仕様書の内容を網羅しきれず、「テストはOKでも不具合は多発」といった結果となりました。
言うは易しですが、あらためてテスト仕様書の大切さとそれをテストコードに反映させるための大変さがうかがい知れました。
SEがテスト駆動開発にチャレンジする意義
これまでテスト駆動開発に対しSIの現場からみると悲観的な考え方を主張してきましたが、「じゃぁ知らなくていいや」という問題ではありません。
あなたの年齢がまだ若いなら今後さまざまな開発案件に出会い、それに合った開発方法を適用する必要があります。
したがってテスト駆動開発を知っておくことで柔軟に対処することができるでしょう。
私は少人数プロジェクトのときにテスト駆動開発を導入することをおすすめします。
次を意識して進めることであなたの知見を広げてくれるでしょう。
- やらないよりも、やってみる
- テスト仕様書のテストケースを網羅する
あなたならどのテスト工程までテスト駆動にしますか?
まとめ
テスト駆動開発は、次のようなたくさんのメリットがあります。
- ゴール(テスト合格)に向かって開発が進められるため効率的である
- テスト可能なプログラムであることを保証する(メンテナンス性、堅牢性の向上)
- テストに合格されたコードであることを保証している
- テスト工程での成果物は、テストコードや合格のレポートを納品すれば良いため工数が削減される
- 積極的なリファクタリングを行いやすい
- 継続的インテグレーションが可能となる
一方でSIの現場では
- システム納品後に拡張
- 改善がないプロジェクト
- テスト駆動開発の良さを享受できない文化
ということが多く、導入しずらいことが現実でしょう。
クックパッドをはじめ、様々な開発論がチャレンジされています。
しかしSEは流行に流されずに本質を見抜き、SIの現場ならではの開発論を極めれば良いと思います。
少しでも参考になれば幸いです。
ITエンジニアを目指したいけど、不安であったり迷いがある方も多いと思います。
ITエンジニアのキャリア相談室では個別にキャリア相談に応じています。
質問・疑問・不安がある方はいつでも気軽にどうぞ。

私もITエンジニアにキャリアチェンジする時、
たくさん悩みました。
気軽にご相談ください^^