RSコラム

ただのエディタとして使うにはもったいない、Visual Studioの便利な機能をご紹介する記事の中編です。

前編後編もご覧ください。

この記事ではVisual Studio 2015 Enterpriseを使って執筆しています。バージョンにより機能や画面が異なることがありますので、ご了承ください。

パフォーマンスプロファイリング

  2017 2015 2013 2012 2010
パフォーマンスプロファイリング Premium以上 Premium以上

システムの処理時間のボトルネックを調査するとき、ソースコード中の随所でタイムスタンプをログ出力させるような方法をとっていませんか? そんなときに便利な「パフォーマンスプロファイリング」機能があります。

パフォーマンスプロファイリングは、プログラムを実行してプロファイルデータを取得し、それらを集計してレポートを作成します。レポートを確認することで、メソッド単位、ソースコード行単位でボトルネックの箇所を特定することができます。

パフォーマンスプロファイリングで得られる情報

パフォーマンスプロファイリングを実施すると、「サンプル プロファイル レポート」が作成されます。レポートには様々なビューがあります。 以下は[概要]ビューです。処理負荷(CPU使用率)が高い期間がグラフによりわかります。[ホットパス]では、処理負荷の高いメソッドが一覧で表示されます。分析のつかみとして、このビューに軽く目を通しておくとよいでしょう。

その他のビューとしては、

  • メソッドの呼び出し順をツリー構造で確認できる[コールツリー]
  • 処理負荷をメソッド単位で一覧にして確認できる[関数]
  • 特定のメソッド呼び出しについて、呼び出し元や呼び出し先のメソッドでどれくらい負荷がかかっているのかを確認できる[関数の詳細]

などがあります。

プロファイリングの種類と特徴

Visual Studioに搭載されたパフォーマンスプロファイルの中で、処理時間に特化したものには、「パフォーマンスウィザード/CPUサンプリング」と、「パフォーマンスウィザード/インストルメンテーション」が存在します。

それぞれの特徴を以下に示します。

設定項目 CPUサンプリング インストルメンテーション
適用対象 CPUがボトルネックとなって処理時間がかかっているプログラム CPU以外の部分がボトルネックとなって処理時間がかかっているプログラム
取得できる内容 処理にかかったCPU時間(IO待ち等のCPU時間がかからない処理は結果に含まれない) 処理にかかったリアルタイム時間(IO待ちや/ネットワーク待ち時間も含む)
プロファイル時の負荷 低(通常の実行時と比較しても大きく変化しない) 高(プロファイルの設定にもよるが負荷は数倍~数十倍)
プロファイルデータの精度 高(プロファイル時の負荷が低いため) 低(特に処理時間が小さいが複数回実行される関数に対して処理時間が大きく出やすい)
取得できる結果の詳細度 ソースコード行単位 関数単位

CPUサンプリングはプロファイリングにかかる負荷が低く、逆にインストルメンテーションでは負荷が高くかかります。あらかじめ、ボトルネックがCPU時間であることが判明している場合は、CPUサンプリングから実施することをお勧めします。 以下では、CPUサンプリング、インストルメンテーションの実施方法をそれぞれ説明します。

パフォーマンスプロファイリングの実施方法

メニューから[分析]→[パフォーマンスプロファイラー...]をクリックします。

次に、分析の対象となるプロジェクトを選択します。基本的には、Visual Studioで対象のソリューション/プロジェクトを開き、対象をスタートアッププロジェクトに設定したうえで、[スタートアッププロジェクト]を選択すればOKです。

使用可能なツールでは[パフォーマンスウィザード]にチェックを入れ、[開始]をクリックします。

パフォーマンスウィザードが表示されます。最初のページでは、使用するプロファイル方法として[CPUサンプリング]または[インストルメンテーション]を選択します。

それ以降は基本的に[次へ]でOKです。[ウィザードの完了後にプロファイルを起動する]にチェックを入れて[完了]をクリックすると、分析対象プロジェクトが実行され、プロファイルが開始されます。

アプリケーション実行中、Visual Studio側では「現在プロファイル中です。」と表示されています。アプリケーションを操作し、プロファイルしたい処理が完了したら[プロファイルの停止]をクリックするなどしてプロファイリングを停止します。

停止すると、前述したサンプルプロファイルレポートが表示されます。表示までには分析の時間が少しかかります。レポートはvspファイルとして保存され、パフォーマンスエクスプローラーに表示されます(インストルメンテーションの場合はvspxファイル)。ここからvspファイルをダブルクリックすることで後から何度でもレポートを確認することができます。

より詳細な情報は下記のMSDNのサイトを参照してください。 参考:パフォーマンス プロファイリングのビギナーズ ガイド

コードの矩形範囲の選択/入力

  2017 2015 2013 2012 2010
コードの矩形範囲の選択/入力

ソースコードエディターでは矩形範囲を選択する機能があります。こまめに活用すればコーディング作業の効率を上げることができます。

この機能では、矩形範囲で選択したテキストのコピーや、選択した各行への新しいテキストの挿入、コピーした内容を矩形範囲に貼り付け、といったことができます(ただしVisual Studioのバージョンによって異なります)。例えば新しいテキストの挿入では、以下のように、メンバー変数のアクセス修飾子を一括でPublicからPrivateに書き換えたいときに有効です。

visual-studio-tips1-fig28.png

矩形選択の方法は、Altキーを押しながらマウスで範囲をドラッグ、もしくはAlt + Shiftキーを押しながら矢印キーで範囲を選択します。

visual-studio-tips1-fig29.png

 

このように選択した状態で”Private”と入力すれば、以下のように反映させることができます。

コードへのブックマークの設定

  2017 2015 2013 2012 2010
コードへのブックマークの設定

メソッドの呼び出し先を何階層も追っていった後に、最初に見ていたソースコードに戻りたくても戻れなくなってしまったことはありませんか? ブックマーク設定の機能を使えば、いつでも特定の位置にカレット(カーソル)を戻したり、ブックマークした箇所の間を移動したりすることができます。

ブックマークの使用方法

ブックマークはソースの任意の行に設定できます。[ブックマークの設定/解除]のアイコンをクリックするか、キーボードでCtrl + K, Ctrl + Kと入力すればOKです。

ブックマークを設定すると、対象の行に以下のようなマークが表示されます。


ブックマークした行に移動したい場合は、[次のブックマーク]のアイコン、もしくは[前のブックマーク]のアイコンをクリックします。キーボードでCtrl + K, Ctrl + N/Ctrl + K, Ctrl + Pを入力しても可能です。次へ/前へは、「ブックマークを設定した順」で移動します。

 

ブックマークウィンドウ

メニューの[表示]→[ブックマークウィンドウ]をクリックすると、ブックマークウィンドウを表示できます。ここには設定したブックマークの一覧が並んでおり、クリックすることでダイレクトにカレットを移動させることができます。

 
 

また、ブックマークに名前をつけたりブックマークをフォルダー管理したりすることもできます。あるフォルダー内のブックマークのみについて、次へ/前へといった移動が可能です。

より詳細な情報は下記のMSDNのサイトを参照してください。 参考:コードへのブックマークの設定

ブレークポイントのインポート/エクスポート

  2017 2015 2013 2012 2010
ブレークポイントのインポート/エクスポート

デバッグのためソースコードの随所にブレークポイントを設定することがあります。ひと段落つくとブレークポイントを解除しますが、また何かの機会で同じようにブレークポイントを再設定したいときはないでしょうか。そんなとき、ブレークポイントの設定をファイルに保存したり、保存したファイルを取り込んで簡単にブレークポイントを再設定したりすることができます。

インポート/エクスポートの方法

以下のように複数個所にブレークポイントを設定していたとします。

メニューの[デバッグ]→[ウィンドウ]→[ブレークポイント]をクリックすると、ブレークプポイントウィンドウが表示されます。設定したブレークポイントが以下の表に一覧になっています。

現在の設定をファイルに保存(エクスポート)したいときは、のアイコンをクリックして名前をつけてファイル保存します(形式はxmlです)。

保存した設定をインポートする場合は、のアイコンをクリックしてファイルを選択すればOKです。現在いくつかブレークポイントを設定している状態でインポートすると、現在のブレークポイントに追加するかたちで内容が取り込まれます。

より詳細な情報は下記のMSDNのサイトを参照してください。 参考:ブレークポイントを管理する

コード分析

  2017 2015 2013 2012 2010
コード分析 Premium以上

プロジェクトで開発するソースコードの品質を上げるためにはどんなことができるでしょうか? 「コード分析」の機能を使えば、決められたルールに従ってソースコード上の問題を機械的に発見することができます。保守性を下げるようなコードや、不具合を起こす可能性があるコードを、人手によるレビュー工数をかけることなくわずかな時間で見つけ出すことができるのです。

コード分析の使用方法

プロジェクトのプロパティで、[コード分析]タブをクリックします。[ルールセット]とは、どんなコード分析を実行することでどんなチェックを行うかを指定するルールを管理するものです。デフォルトでは「Microsoft マネージ推奨規則」が選択されています(Visual Studioのバージョンによって異なる)。ルールセットについては後述します。

 
 

コード分析を実行するためには、メニューの[分析]→[ソリューションでコード分析を実行]をクリックします。ソリューションエクスプローラーで右クリックし、[ソリューションでコード分析を実行]でも同様です。プロジェクト単位で行いたいときは、対象のプロジェクトで右クリックし、[分析]→[コード分析の実行]をクリックします。

 

また、プロジェクトのプロパティの[コード分析]タブで、[ビルドに対するコード分析の有効化]にチェックを入れると、ビルドするたびに分析が実行されます。

分析結果の確認方法

分析の結果は、以下のように[エラー一覧]ウィンドウに表示されます。ある項目をクリックすると、指摘の対象となっているソースコード行にジャンプします。指摘の内容によってはジャンプしないものもあります。

また、[コード]列にはマイクロソフトのサイトへのリンクとなっており、指摘内容の詳細(何が問題なのか、といったこと)を確認することができます。リストアップされた指摘を解消していくことで、プロジェクト全体で均質的な品質の高いソースコードにしていくことができます。

ルールの設定

コード分析で適用するルールセットは標準でいくつか用意されています。選択したものによってどれくらい厳しいチェックになるかが決まります。用意されたセットの説明については、「コード分析規則セットの参照」をご参照ください。

さらに、[開く]をクリックするとルールセットの詳細を確認できます。


以下のように、各ルールセットは個別のルールが取捨選択されたパターンとなっています。ここでは詳細は割愛しますが、あるルールセットをベースとしてカスタマイズができるので、プロジェクトに合ったオリジナルのルールセットを作れば、効果的にコード分析を活用できるでしょう。


より詳細な情報は下記のMSDNのサイトを参照してください。
参考:コード分析を使用したマネージコードの品質の分析

コードメトリックス分析

  2017 2015 2013 2012 2010
コードメトリックス分析

Visual Studioの機能を使うと、ソースコードの「保守容易性」や「複雑度」をコードメトリックス値として定量的に評価することができます。この評価結果を保守性に問題がある部分の特定に利用したり、プロジェクトとしての品質指標に用いたりすることで、ソースコードの品質向上につなげることができます。

コードメトリックス値の生成方法

メニューから[分析]→[ソリューションのコードメトリックスを計算]をクリックします。ソリューションエクスプローラーで特定のプロジェクトを選択している場合は、そのプロジェクトのみについて計算することもできます。プロジェクトにビルドエラーが発生している場合は計算ができないので注意してください。

 

コードメトリックスの分析

コードメトリックスの計算が完了すると、以下のように[コードメトリックスの結果]ウィンドウが表示されます。


評価項目は「保守容易性指数」、「サイクロマティック複雑度」、「継承の深さ」、「クラス結合」、「コード行」となっており、最も細かい粒度ではメソッド単位で値が算出されます。

コードメトリックス分析で評価しているのは、簡単に言うとソースコードの読みやすさ、修正のしやすさです。各評価項目の説明は、MSDNのサイトでは以下のように説明されています。評価が悪い項目について、保守性をあげるにはどのような観点で改善するかの参考にしましょう。

項目 説明
保守容易性指数 0~100 の値を算出しており、値が大きいほど、保守容易性が優れています。20~100の値であれば保守性が良好とされ、10~19が中程度、0~9は保守容易性が低いことを示します。
サイクロマティック複雑度 コードの構造上の複雑さを測定したもので、値が小さいほど保守容易性が優れています。複雑なプログラムでは、十分なコードカバレッジを実現するためにはより多くのテストが必要となります。
継承の深さ クラス階層構造のルートまでのクラス定義の数を示します。 階層構造が深くなるにつれて、特定のメソッドおよびフィールドが定義または再定義されている場所を把握することがより困難になる場合があります。
クラス結合 パラメーター、ローカル変数、戻り値の型、メソッド呼び出し、ジェネリックまたはテンプレートのインスタンス化、基本クラス、インターフェイス実装、外部の型で定義されたフィールド、および属性による装飾を使用して、一意のクラスへの結合度を測定します。結合性が高いということは、他の型への依存関係が多いために再利用や保守が困難なデザインであることを示します。
コード行 コード行の概数を示します。数が低いほど保守容易性が優れています。この数は、ILコード(ビルド後のバイトコード)に基づいているため、ソースコードファイルの行数と完全一致するものではありません。

より詳細な情報は下記のMSDNのサイトを参照してください。
参考:コードメトリックス値

いかがでしたでしょうか? 1つでも参考になれば幸いです。後半に続きます。

単体テスト

  2017 2015 2013 2012 2010
単体テスト

開発したプログラムの単体テスト(メソッドレベルのテスト)を実施したいけれど、どのような手法で実施すべきかお悩みではないですか? Visual Studioには単体テストの仕組みが搭載されています。この仕組みに則ることで、統一感のあるテストコードが作成できます。また、一度作成してしまえば繰返してテストを実施できるため、バグ改修後の再テストや回帰テストの工数を削減できます。

単体テストプロジェクトの作成

Visual Studioで整備された単体テストを実施する仕組みを利用するために、「単体テストプロジェクト」を作成します。テストの対象となるアプリケーション(プロジェクト)を含むソリューションに単体テストプロジェクトを追加します。

メニューから[ファイル]→[追加]→[新しいプロジェクト...]をクリックします。Visual Basicの単体テストコードを作成する場合はダイアログで、[インストール済み]→[Visual Basic]を展開し、[テスト]をクリックします。テンプレートから[単体テスト プロジェクト]をクリックし、名前を入力して[OK]をクリックします。単体テストプロジェクトを作成するには.NET Frameworkの3.5以上が必要です。

visual-studio-tips2-fig01.png

以下のようにソリューションに単体テストプロジェクトが追加されます。テスククラスとテストメソッドのひな形となる.vbファイルがあらかじめ作成されています。

visual-studio-tips2-fig02.pngsl

単体テストプロジェクトの参照設定に、テスト対象となるプロジェクトを追加します。この説明では「BankAccount」プロジェクトをテスト対象とします。参照を追加すると以下のようになります。

visual-studio-tips2-fig03.png

単体テストコードの作成

単体テストの考え方として、テスト対象(開発したプログラム)をメソッド単位で検証します。検証するためのテストコードはテストメソッド内に記述します。前述したとおり、テストクラス・テストメソッドのひな形があらかじめ作成されているので、それを流用して記述していきます。

テストメソッドの大まかな流れは、テストデータの作成 → メソッドの実行 → 実行結果と期待値を比較 です。以下の例は、BankAccountクラスのDepositメソッドを検証するテストメソッドです。

visual-studio-tips2-fig04.png

Depositメソッドは、「引数で与えられた金額を預金残高に加算し、加算後の預金残高を戻り値として返す」という動作をします。上図のコードでは、8行目でメソッドの引数を、9行目で期待値を設定し、10行目でDepositメソッドを実行しています。そして、11行目で期待値とDepositメソッドの結果(戻り値)を検証しています。後述しますが、検証にはAssertクラスなど、Visual Studioのテストフレームワークで整備された検証用のクラスを利用します。

次に、エラー発生時の動作を検証するテストコードについて説明します。BankAccountクラスのDrawメソッドの検証で説明します。Drawメソッドは、引数で与えられた金額を預金残高から減算します。ただし、もう一つの引数として暗証番号を受取り、インスタンスが保持している暗証番号と一致しない場合は例外(SecurityException)を発生させる仕様です。

テスト対象のメソッドを実行した結果、例外が発生することが望ましい結果である場合は、下図のコードのように<ExpectedException>属性を付加し、期待する例外クラスを記述します。この場合、メソッド実行後の検証を行うコードは記述しません。メソッドを実行した結果、期待する例外がスローされれば検証はOKとなります。

visual-studio-tips2-fig05.png

<ExpectedException>属性を使わない別の方法を紹介します。Try-Catchブロックを使った以下のようなコードを記述します。以下では、Drawメソッドを実行した結果、例外がスローされない場合はTryブロック内のAssert.Fail()が実行されることにより検証はNGとなります。期待する結果はArgumentExceptionがスローされることですが、Catchブロック内にエラーメッセージを確認するなど、さらに検証を記述できます。もしArgumentException以外の例外がスローされた場合は、Catchされないためテストメソッドの実行結果はNGとなります。

visual-studio-tips2-fig06.png

以下にAssertクラスが持つメソッドの一部を紹介します。

メソッド 説明
AreEqual 引数で指定した2つの値が同一であることを検証する。同一で無い場合、テスト結果はNGとなる。
AreNotEqual 引数で指定した2つの値が同一ではないことを検証する。同一である場合、テスト結果はNGとなる。
IsNull 引数で指定したオブジェクトがNullであることを検証する。Nullでない場合、テスト結果はNGとなる。※IsNotNullメソッドもある。
IsTrue 指定した値(条件)がTrueであることを検証する。Falseの場合、テスト結果はNGとなる。※IsFalseメソッドもある。
Fail このメソッドが実行されると無条件にテスト結果がNGとなる。

他にも、文字列に特化したStringAssertクラスやコレクションに特化したCollectionAssertクラスがあります。

単体テストの実行

テストの実行方法は簡単です。テストプロジェクトをビルドした後、メニューの[テスト]→[実行]→[すべてテスト]をクリックすると、テストプロジェクト内の全てのテストが実行されます。

visual-studio-tips2-fig07.png

実行結果は[テスト エクスプローラー]に表示されます。テストメソッド単位で成功した件数/失敗した件数がわかります。失敗したテストをクリックすると、失敗の内容(期待値が○○で実際の結果は××、など)が表示されます。

visual-studio-tips2-fig08.png

特定のテストクラス内のテストや、テストメソッドを個別に実行したい場合は、テストコードのクラス名やメソッド名上で右クリックし、[テストの実行]をクリックすることで可能です。

単体テストプロジェクトの自動作成(VS2010)

Visual Studio 2010であれば、テスト対象のプログラムから、単体テストプロジェクト・テストクラス・テストメソッドを自動で作成することができます。ただし、後述しますがテスト仕様まで自動で作成してくれるものではありません。

開発したプログラムのテスト対象となるクラス名やメソッド名の上で右クリックし、[単体テストの作成...]をクリックします。以下はVisual Studio 2010の画面です。

visual-studio-tips2-fig09.png

単体テストの作成ダイアログが表示されます。右クリックしたクラス/メソッドを含むプロジェクト全体から、単体テストを作成したいものにチェックを入れます。

visual-studio-tips2-fig10.png

[OK]をクリックし、単体テストプロジェクトの名前を入力すると以下のように単体テストプロジェクトがソリューションに追加されます。テストメソッドの中には、検証するメソッドの引数や期待値の設定、検証メソッドの実行やAssertのコードが作成された状態になっています。ただし、引数や期待値に設定している値に意味はないため、テスト仕様に従って書き直す必要があります。

visual-studio-tips2-fig11.png

より詳細な情報は下記のMSDNのサイトを参照してください。 参考:「チュートリアル:マネージ コードに対する単体テストの作成と実行」

後半に続きます。

TOP