改めてコードの品質を見直してみませんか? (Visual Studio 各エディション機能解説添え)

※関連する記事や動画のリンクを追記 (2011.10.31 Halloween)

Visual Studio のサイトで、お得な情報がいくつか掲載されています。

これにちなんで、いくつかブログ記事も書いてみました:

ふと思い出したのですが、4年前くらいにコードの品質についてと TDD について、セッションで解説をしました(最近こういう粒度の解説していませんが、ご要望ありましたらリクエストください):

image

これが、よくあるコーディングして、ビルドして、デバッグ実行して動作確認するという流れの図です。これは、Visual Studio のどのエディションでももちろん実施ができるものになります。

コードが書けて、ビルドでコンパイルチェックできて、デバッグで動作を確認できて・・・一見、十分な気がします。

でも、このコードが、正しいか、適切な確認をしたか、品質が適切か、だれもわかりません。コードを書いた本人だってわからないです。人は、違う仕事を3つか4つやったら記憶がおぼろげになります。たとえば、デバッグで動作を確認したとして、そのときに行った操作を正確に覚えていて同じことができ、同じ結果になっていることを確認することを継続して行うことはきっとできないです(私はできません)。

本人ですらおぼろげなのに、チームの他の開発者、品質を見る人たちに理解できるでしょうか?

この「あいまい」な、コードを積み重ねていたったら・・・はたしてそのソフトウェアは適切な品質だと誰が自信を持って言えるでしょうか?

# そもそも、デバッグはテストではないですしね

次の絵をご覧ください。

image

ここに、ビルド時には、規約のチェック(いわゆる静的コード分析)が行えて、テストもデバッグを使うのではなく、単体テストのフレームワークを使い、何度でも実行でき、結果も収集蓄積できたらどうでしょうか?その際にコードのカバレッジ(※テストがコードのどれくらいをカバーしてくれているか)も測定し、可視化できたらどうでしょうか?

ただしトレードオフがあります。最初の図と2番目の図で明らかにステップ(要するにテマ)が増えています。本来やらないといけないけど、テマが増えるので実施できないと思っている開発者、チーム、組織もまだまだ多くあると耳にします。だからこそツールを活用すべきですし、ツールがあります。

ツールで、カバーすることで本来はやっておきたいことを行いつつ、本業(クリエイティブなコードの制作)に専念できるわけですね。デバッグで動作確認とか、自信がないからなんども手で確認したり、説明できないからあの手この手・・・(以降、省略

Visual Studio のエディションでいうと、以下にようになります(ざっくりです):

  • Visual Studio 2010 Express:
    • ビルド(コンパイル):
      • やってくれます。
    • あとは、ご自身で頑張ってください。
  • Visual Studio 2010 Professional:
    • 単体テストのフレームワーク:
      • テストコードを書き、テストを自動実行し続けることができるようになります。
      • テストコードのスケルトン自動生成もあるので、 テストコードの作成のテマも軽減できます。
      • データ駆動テストを用いれば、境界値テストなどもテストメソッドをたくさん作らなくても行えるようになります。
      • 単体テストのフレームワークで、主にビジネスロジックのテストは、客観的に行えるようになります。その機能を外から見て使用する立場でテストを書き、実行しますから、仕様の誤りを発見することにももちろん役立ちます。
      • テストは、何度でも実行できますので、コードを少しでも変更したら、即テストを実行!と開発の流れがスムーズかつテスト実行と結果が収集される・・・劇的に開発環境が変わりますね。
    • TFS との連携:
  • Visual Studio 2010 Premium:
    • このエディションは、コード品質に関して Professional など比較にならないくらいメリットを提供してくれます。
    • コード カバレッジ:
      • コードのカバレッジを収集し、ソースコードにカラーハイライトでテストが通過したロジックと通過しなかったロジックを一目で把握することができるようになります。
      • TFS とコード カバレッジの連携:
        • TFS の自動ビルドにおいて、単体テストの自動実行が行えます。このときにコード カバレッジも自動収集することができます。これにより、毎回のビルドでコードのカバレッジ率が上がっていくことを実感できるようになります(下がった場合は品質が見えにくくなってきてることも実感できます)。
      • 関連動画: Visual Studio 2010 単体テストとコード カバレッジ on YouTube
    • 静的なコード分析:
      • 命名規約やセキュリティなど .NET Framework クラスライブラリの規約に準拠したチェックをいつでも実行し、確認ができます(※手動でいつでも実行できるほか、ビルド時に自動実行させることもできます
      • TFS と静的コード分析の連携:
        • チェックイン時にコード分析が実行されていないとチェックインをさせないルールをセットし忘れないようにすることもできますし、TFS の自動ビルドで、自動実行させ、ビルドレポートに記録することもできます。コード分析は、強制的にビルドエラーにしてしまうこともできるので、コンパイラの構文チェックはとおっても規約に即していないコードをエラーにすることだってできます)。
    • コード メトリックス:
      • ソースコードは、ロジックの集合体ですから、全体を俯瞰して把握するのは結構難儀です。ですが、コード メトリックスを使うと、コードの状況をソリューション、プロジェクト、クラス、メソッドの各粒度で数値化してくれます。
      • 数値化されるのは、「保守容易性インデックス」としてまとめられます。これは保守しやすいコードなのかを100点満点でレポートをしてくれるものです(※100点を目指すものではないのでご注意ください)。
      • 保守容易性インデックスは、サイクロマティック複雑度、クラスの結合度あい、階層の深さ、コード行などから割り出されますし、これらも数値としてレポートされます。
    • 単体テスト フレームワークと自動 UI テスト:
      • そして単体テストとしては、ビジネスロジックだけではなく、UI のテスト、DB アクセスのテストも実施できるようになります。UI のテスト(コード化された UI テスト)は、UI の操作を自動記録し、いつでも自動実行して動作と検証を行えるようにしてくれるものです。
      • 要するに、先述した「デバッグ実行で・・・」を正しいテストとして実施ができるようにしてくるものだとここでは思ってください。当然、コードのカバレッジも取れますし、設定次第では、自動実行した操作をビデオ録画したものをテスト結果に含めることもできます。
      • 関連動画: Visual Studio 2010 の UI テストを TFS 自動ビルドに組み込むとこうなる! on YouTube
    • プロファイリング(動的コード分析):
      • 動的テストとしては、プロファイルの機能がありますので、コード上のボトルネックを検出するなど動かさないと分析できないような悩みにも役立ちます。一つ紹介すると、2010から JavaScript のプロファイルができるようになっています。JavaScript は UX にとっても非常に重要な位置を占めますが、このボトルネックとなる箇所を検出したりすることができるわけです。
    • テスト影響分析:
      • Premium では、コードを少しでも変更した際に、実行すべきテストを教えてくれる機能もあります(テスト影響分析)。コードを変更したらすべての単体テストを実行するのが理想ですが、数が膨大になるとなかなかそうは言ってられなくもなります。この機能が勝手に、今テストした方がいいものを教えてくれるので、コードを変えたら、即最適なテストだけを実行し、効率UPなんてこともできるわけです。
      • 関連動画: Visual Studio 2010 テスト影響分析のデモ
    • データベースの変更管理とテストデータの自動生成:
      • DB にテストデータを自動生成して入力させたり、DB のスキーマの変更管理を行ったりいろいろとコードレベルの品質に効果がある機能が豊富で、今の時代の開発で、事実上のスタンダードなのがこの Premium というエディションになります。
  • Visual Studio 2010 Ultimate:
    • このエディションになるともう、それはそれは困っている人手ではなかなか苦労が絶えないところをさらに支援してくれます。
    • 単体テストの負荷テスト:
      • 単体テストは動作させ確認できますが、特にWeb アプリケーションになると高負荷状態で問題なくパフォーマンスが発揮できるかはわかりません。このエディションだとロードテストの機能があるので、これを単体テストに適用すると単体テストに負荷をかけてしまうことができます。もちろん、Web アプリに対して特定のシナリオで操作し(それを HTTPRequestレベルでキャプチャ)し、ネットワーク帯域、ブラウザの種別など実利用シナリオで、負荷をかけて動作させ、各種データをレポート、分析なんてこともできます(ちょっと余談)。
    • IntelliTrace:
      • デバッグも IntelliTrace という近未来的なデバッグ機能があります。デバッグしながら、巻き戻しができるので、ステップ実行して分析しているときに、ちょっと行き過ぎてしまった!なんてときにデバッグをもう一度最初から実行しなおすなんて悲しい事件がなくなります。
      • また、テスターさんが手動テストしていてアプリが落ちてしまったなどの際にも、デバッグ情報をファイルにして、開発者にわたし、即落ちたところからデバッグを実行!なんて神業もできてしまいます。劇的にめんどくさい、困った、イライラするテマを軽減できてしまうわけです。
      • 関連動画: IntelliTrace on Channel9
    • さらにさらに、コーディングしているとだんだん把握できなくなる依存関係や当初のアーキテクチャーとかい離ができてしまう悲しい実情も改善できます。
    • レイヤー図:
      • あらかじめアーキテクチャをモデルとして書き、依存関係を規定できます。この依存関係に違反したロジックは、ビルド時にエラー判定させることができるので、開発者は、アーキテクチャを十分に把握していなくても(本当はそれでは困りますが)、ビルド時にコンパイラのエラーだけでなくアーキテクチャ上の制約もその場で気づき、改善することができます。
      • 関連動画: レイヤー図によるいつでもアーキテクチャ検証 on YouTube
    • UML (※ここでは シーケンス図の自動生成のみ紹介):
      • メソッドを選択し、UML のシーケンス図を自動生成することもできます。これによりそのメソッドがどういう経路でメッセージが流れていくのかを把握できます。たとえば、単体テストのテストメソッド内のテスト対象メソッドでこれを実行すれば、そのテストで実際に通るロジックを瞬時に把握できてしまうわけですね。
      • 関連動画: Visual Studio 2010 UML シーケンス図の自動生成 on YouTube
    • 依存関係グラフ:
    • Test Manager:
      • Ultimate には テストの計画から実行、バグ起票や分析が行えるテスト専門ツール Test Manager がついています(Test Manager は Visual Studio 2010 Test Professional でも提供されます)。
      • コード品質の観点での Test Manager の効果の一部は、以下です。
      • 単体テストの自動実行:
        • テスト ケースとして単体テストを登録すれば、たとえコードの理解ができないテスターさんやお客様でも、単体テストをテスト環境で自動実行し、結果を得ることができます。単体テスト、単体テストコードとなる開発者のもの・・・と及び腰になりますが、Visual Studio からでなくても、実行ができるわけです。
        • これは、もちろん、自動 UI テストでも同じです。したがって、開発者が作成した UI テストを元にして、テスターは、はじめから手動テストではなく、自動でテストを行って、目視で確認できるわけです。
      • 手動テストの自動化と、単体テスト フレームワークで実行:
        • Test Manager は手動テストを効率化する仕組み、バグ起票をほぼ自動化する仕組みを内包しています。手動テストは、一度実行すれば、2回目以降自動化が可能です。この自動化した手動テストは、Visual Studio から自動 UI テスト(コード化された UI テスト)として単体テスト フレームワークで実行できるようにできます。
        • したがって、テスターの労力を開発者のテストに反映できてしまうわけです。
      • 関連動画: 手動テストの自動化 on YouTube
      • 関連動画: バグ表示からビデオ再生まで on YouTube
      • 関連動画: 手動テストの自動化と仮想テスト環境での自動実行 on YouTube
      • 関連動画: TFS 2010 と Lab Management による自動デプロイの実現 on YouTube

後半になるに従い、「機能豊富でついていけない・・・」と思ってしまった方もいるかもしれません。でもよく現場を思い返してください。手動であったり、なんとなくであったりしても、実はこれらはやっていませんか?もしくは、「やるべき」と思っていながら、納期のプレッシャーや、漠然とした忙しさに諦めてしまっていませんか?

今回の投稿は、コードの品質といってもまだまだ、やれることあるし、ツールも充実しているので、開発者は、もっとクリエイティブな本業に注力できるのに・・・という想いだけで、一気に、そして思い付き(当たり前ですが何の資料も見てません)で書いてみました。

もしご興味ある方がいれば、セッションでできるように準備するなりしてみようかと思います。

そうそう、コードの品質ということだと テスト駆動開発(TDD)を忘れてはいけません。TDD については、Visual Studio だと Professional から単体テスト フレームワークがありますので、実施可能です。リファクタリングの機能もありますし、コード スニペットにも、TDD 用のものが含まれています。

ついでですが、4年ほど前に書いた図を貼りつけて、この投稿の結びとしたいと思います:

image

TDD と Visual Studio の各機能のマップのスライドも作ったのですが、どこかへ行ってしまったので、見つかったら挙げておきますwww (Visual Studio 2008 の記載は、下記、追記で紹介した記事内にあります)

[追記]
さて、コードの品質と Visual Studio 2010 の各機能に触れてきましたが、 TDD もそうですが、各単一の機能が、問題を解決してくれるとはかぎりません。これは、プラクティスとツール機能の関係が必ずしも、1:1 ではないということです。逆に、この関係が、 1:1 であったなら・・・それはきっと特性課題をに効果を発揮する超限定的な機能になることでしょう。

このあたりについては、これも3年前くらいに書いた記事をご覧ください:

プラクティスとツール機能

ながさわ