検索
リンク
タグ
ASP.NET
.NET
ASP.NET MVC
F#
Visual Studio
Azure
ASP.NET Core
ライトニングトーク
Plone
AJAX
Selenium
C#
jQuery
ADO.NET Entity Framework
SQL Server
JavaScript
LINQ
WebMatrix
EFCore
Fizz-Buzz
カテゴリ
最新の記事
最新のコメント
記事ランキング
最新のトラックバック
以前の記事
2023年 01月 2022年 12月 2022年 11月 2022年 10月 2022年 09月 2022年 08月 2022年 07月 2022年 06月 2022年 05月 2022年 04月 2022年 03月 2022年 02月 2022年 01月 2021年 12月 2021年 11月 2021年 10月 2021年 09月 2021年 08月 2021年 07月 2021年 06月 2021年 05月 2021年 04月 2021年 03月 2021年 02月 2021年 01月 2020年 12月 2020年 11月 2020年 10月 2020年 09月 2020年 08月 2020年 07月 2020年 06月 2020年 05月 2020年 04月 2020年 03月 2020年 02月 2020年 01月 2019年 12月 2019年 11月 2019年 10月 2019年 09月 2019年 08月 2019年 07月 2019年 06月 2019年 05月 2019年 04月 2019年 03月 2019年 02月 2019年 01月 2018年 12月 2018年 11月 2018年 10月 2018年 09月 2018年 08月 2018年 07月 2018年 06月 2018年 05月 2018年 04月 2018年 03月 2018年 02月 2018年 01月 2017年 12月 2017年 11月 2017年 10月 2017年 09月 2017年 08月 2017年 07月 2017年 06月 2017年 05月 2017年 04月 2017年 02月 2017年 01月 2016年 12月 2016年 11月 2016年 10月 2016年 09月 2016年 08月 2016年 07月 2016年 06月 2016年 05月 2016年 04月 2016年 03月 2016年 02月 2016年 01月 2015年 12月 2015年 11月 2015年 10月 2015年 09月 2015年 08月 2015年 07月 2015年 05月 2015年 04月 2015年 03月 2015年 02月 2015年 01月 2014年 12月 2014年 11月 2014年 10月 2014年 09月 2014年 08月 2014年 06月 2014年 04月 2014年 03月 2014年 02月 2014年 01月 2013年 12月 2013年 10月 2013年 09月 2013年 08月 2013年 07月 2013年 06月 2013年 05月 2013年 04月 2013年 03月 2013年 02月 2013年 01月 2012年 12月 2012年 11月 2012年 10月 2012年 09月 2012年 08月 2012年 07月 2012年 06月 2012年 05月 2012年 04月 2012年 03月 2012年 02月 2012年 01月 2011年 12月 2011年 11月 2011年 10月 2011年 09月 2011年 08月 2011年 07月 2011年 06月 2011年 05月 2011年 04月 2011年 03月 2011年 02月 2011年 01月 2010年 12月 2010年 11月 2010年 10月 2010年 09月 2010年 08月 2010年 07月 2010年 06月 2010年 05月 2010年 04月 2010年 03月 2010年 02月 2010年 01月 2009年 12月 2009年 10月 2009年 09月 2009年 07月 2009年 06月 2009年 05月 2009年 04月 2009年 03月 2009年 02月 2009年 01月 2008年 12月 2008年 11月 2008年 10月 2008年 09月 2008年 08月 2008年 07月 2008年 06月 2008年 05月 2008年 04月 2008年 03月 2008年 02月 2008年 01月 2007年 12月 2007年 11月 2007年 04月 2007年 03月 2007年 02月 2007年 01月 2006年 11月 2006年 10月 2006年 09月 2006年 08月 2006年 07月 ファン
ブログジャンル
画像一覧
|
2015年 08月 31日
先日、CLR/H カフェ #3 を開催し、前回投稿の jasmine 単体テスト実行環境を構築することをメインテーマに参加者各位が集まった。
その CLR/H カフェ #3 の席にて、「なぜ単体テストを書くのか?」という話が持ち上がった。 このブログ記事では CLR/H カフェ #3 で披露させていただいた持論を採録したいと思う。 単体テストを書く理由単体テストの効能はあちこちで言及されていると思うので、ここでは割愛する。単体テストの効能は、それはもう、いろいろと多数挙げられることだろう。 しかし、それらいろいろな理由のどれよりも、自分が単体テストを書く動機として強くあるのは、以下の2つだけだ。
1. コードを変更してもデグレートを起こしにくくなる多くのソフトウェア製品というものは、多かれ少なかれ、仕様や実装の変更が付きものだと思う(少なくとも自分の経験の上ではそうだった)。そうしたソースコードの変更が発生する場合に、単体テストが整備されていたらどうだろう。 コードの変更によって、別の機能を壊してしまった場合、単体テストの失敗という形でそれを知ることができる。 よって、何かしらの理由に伴うコード修正にあたって、別の不具合を引き起こす危険はそのぶん低く抑えることができる。 しかし単体テストが備わっていなかったら? コード修正にともなうほかの不具合を併発する危険度はぐっと上がってしまうことだろう。 また、本当に他の不具合を引き起こすかどうかというだけでなく、コードの修正に対する開発者の姿勢・気持ちにも大きく影響がある。 単体テストがあれば、これから自分の行うコード修正が悪影響を起こす心配をすることなく、たとえ自分がイチから書いたわけではない他のメンバーが書いたコードに立ち向かうときでも、自信をもって積極的なコード修正に取り組むことができるだろう。 何か間違ったことをしでかしたら、単体テストが失敗することでわかるのだから。 しかし単体テストがなければ、ひるんでしまうのが人の気持ちというものではないだろうか。 単体テストがあれば「ボーイスカウトルール」、すなわち「来た時よりも綺麗に」の習慣により、積み重なる仕様変更や実装修正に対しても、プログラム全体は見通しよく適切なアーキテクチャとアルゴリズムで構成され、それが維持されていることだろう。 しかし単体テストがなければ、どうしても「動いているものは変えない」主義に流れざるをえない。 単体テストなしに「ボーイスカウトルール」をやってしまうと、むしろ大惨事であろう。 そういう点では、単体テストがない体制では「動いているものは変えない」主義は正しい選択であると思う。 しかしそのような体制のもとで作られたソフトウェア製品は、積み重なる修正に対し、その構造が健全なまま維持できるかというと甚だ疑問である。 溶岩流アンチパターンの絶好の棲み処となろう。 2. プログラムがより早く仕上がる場合がある「単体テストコードを書く工数が増えているのに、なぜ早く仕上がる?」と思われる節もあるかもしれないが、難しい話ではない。とある GUI なソフトウェア製品の開発中、とある機能を実装している際に、その機能を開発者自身が多少なりとも動作点検・試行せずにリリースすることはないだろう。 さらに、その "とある" 機能への入力の組み合わせが、まぁまぁメンドクサイ場合を想定してほしい。 具多的な例示が難しいが、性別・生年月日・配偶者有無、その他いくつかの入力項目を入力したら、それら入力項目の内容に応じて何かの金額計算をする、といったようなフォームを作っていることを想像するといいかもしれない。 このようなときに、単体テストの体制ができあがっていれば、実装作業はサクサク進む。 すなわち、実装コードとテストコードを書いたらテスト実行するだけ。 自分は Visual Studio 上で C# コードでの開発をすることが多いのだが、この場合だと、Ctrl + R, Ctrl + T の2ストロークのキーボードショートカットを叩くだけでテスト実行される。 しかし、単体テストの体制が整ってなければどうだろう。 実装コードを書いたら、GUI 経由で入力項目を手入力し計算結果が仕様どおり正しいか確認する流れとなろう。 ここでネックになるのが "入力項目を手入力" の部分だ。 当たり前だが、このようなメンドクサイフォームに色々な組み合わせを "手入力" するのは結構時間がかかる。 「単体テストコード書いてる時間より、手入力しててもまだ早いんじゃないの?」という場合もあるかもしれない。 しかし普通は、実装コードが一発でひととおりの入力にパスすることは少ないのではないだろうか。 その場合、単体テスト体制があれば、実装コードだけなおしてあとはテスト実行するだけで済む。 しかし単体テスト体制がなければ、"手入力" をまた最初からやり直しである。 ここで実装スピードに圧倒的な差がつくわけである。 これが「単体テストを書いたほうが、プログラムがより早く仕上がる場合がある」という理由だ。 まとめ以上、自分が単体テストを書く動機についてまとめてみた。自分は上記2つの理由を背景に、単体テストを "書かされる" のではなく、"書きたくなる" 気質となったと思う。 気持ちよく自信を持ってプログラムの構造改革に取り組めるし、場合によってはかったるい GUI 経由の手入力することなく実装を進められるのだから。 しかしところが、"テストを書きたくなる" と自称しているのとは裏腹に、自分の取り組みの場合、単体テストの網羅度 (カバレッジ) は、実はかなり低いと思う(ちゃんとカバレッジ計測したこともない)。 CLR/H カフェ #3 ではその点にも話が至り、「どのような部分に対して単体テストを書いているのか」「どこまで単体テストを書いているのか」という話題も持ち上がった。 いずれ機会があれば、これら「どんな単体テストを書いているのか?」もここに投稿(白状?)してみたいと思う。
by developer-adjust
| 2015-08-31 22:20
| テスト
|
Comments(0)
|
ファン申請 |
||