作業を中断し、バグを修正し、コード レビューを行います。

ある作業スレッドから別の作業スレッドに作業コンテキストを 1 クリックで切り替える強力な方法が、Team Foundation Server と組み合わせた Visual Studio Premium と Visual Studio Ultimate で使用できます。 また、チーム メンバーは提案されたコード変更に関するメッセージを簡単に交換できます。 このトピックでは、架空のアジャイル チームのメンバーを 1 日追いかけるチュートリアルを続行して、これらの機能について説明します。

ピーターは、バックログ項目のタスクを実行するコードの作成に没頭しています。ところが、同僚が作業の邪魔になるバグを見つけたため、ピーターはそれをすぐに修正しようとします。 ピーターは取りかかっている作業を中断して、バグを修正します。 ピーターはジュリアに修正をレビューするように頼み、レビューを受けた後、修正をチェックインして元のタスクに関する作業を再開します。

注意

ピーターが使用する担当作業機能とコード レビュー機能は、Visual Studio Premium および Visual Studio Ultimate でのみ使用できます。

このトピックの内容

  • 現在の作業を中断してバグの修正作業を開始する

  • バグを調査する

  • コード レビューを依頼する

  • コード レビューを引き受けて実行する (または拒否する)

  • コード レビューを受け取って応答する

  • テストとコードを修正する

  • 修正をチェックインする

  • タスクの作業を再開する

現在の作業を中断する

ピーターがバックログ項目に関する作業をしているときに、邪魔なバグについてジュリアが話し合いにやってきました。 バグはピーターが熟知した分野のものであったため、バグを修正するタスクを作成して、自分自身に割り当てました。 ピーターは修正作業を直ちに開始することにしました。

新しいバグの修正作業を開始する前に、ピーターは現在の作業をチーム サーバーの安全な場所に保存しておくことにしました。 [担当作業] ページで、[中断] をクリックして以下の項目を保存します (Team Foundation Server 上)。

  • コード、テスト、およびその他のファイルに対する変更を含む実行したすべての作業。

  • 開いているソリューション、ウィンドウ、ブレークポイント、ウォッチ ウィンドウ変数など、Visual Studio の各種状態。

これでワークスペースがきれいになったため、ピーターは新しいタスクを [使用できる作業項目] から [処理中の作業] にドラッグします。 修正を調査して記述する準備ができました。

注意

作業コンテキストは、[担当作業] ページに [処理中] と表示される作業項目にリンクされています。[中断][再開] を使用すると、異なるタスクをすばやく切り替えることができます。開いているソリューションとファイル、コードの変更、Visual Studio のレイアウトもすべて一緒に切り替えられます。

現在の作業を中断して異なるタスクの作業を開始するには

一部の作業の中断

  1. 接続: 作業するチーム プロジェクトにまだ接続されていない場合は、チーム プロジェクトに接続します。

    1. チーム エクスプローラーで、[ホーム] アイコン[ホーム][担当作業] アイコン[担当作業] の順にクリックします。
  2. 中断: 現在のタスクを中断します。

    1. [処理中の作業] セクションで、[中断] をクリックします。

    2. 表示されるダイアログ ボックスで、この中断する作業セットに付ける名前を指定し、[中断] をクリックします。 既定の名前は、現在処理中の作業項目です。

  3. 作業の開始: 新しいタスク、バグなどの作業項目に関する作業を開始します。

    1. 作業項目を選択する前に、以下を実行できます。

      • [使用できる作業項目][新規作成] をクリックして、新しいタスクなどの作業項目を作成します。

      • [使用できる作業項目] で別のクエリを選択します。

    2. [使用できる作業項目] から [処理中の作業] に作業項目をドラッグします。

      別の方法として、以前に中断した作業項目を [中断されている作業] からドラッグすることで、その作業項目に切り替えることもできます。

ヒント

現在処理中の作業項目は、現在のコード変更と Visual Studio 状態にリンクされます。Visual Studio で作業を整理できるように、あるタスクから別のタスクに切り替えるときは、適切な項目が処理中の状態であることを確認します。

バグを調査する

ピーターは、バグ作業項目を開いて、内容を読みます。 テスト チームのメンバーが書いた説明によると、支払い済みの請求書に未払いというフラグが設定されることがあるというバグです。 バグ作業項目にはラボ環境のスナップショットが添付されています。 ピーターは、テストが実行された仮想マシンを開き、間違った請求書を表示して、IntelliTrace ログをさかのぼります。 次のメソッドまで不具合をトレースしました。

    public class LocalMath
    {       
        public static bool EqualTo(double a, double b)
        {
          return a == b;
        }

IntelliTrace ログから、パラメーターの値がごくわずかに異なるためにメソッドがときどき false を返すことがわかりました。 浮動小数点演算ではこの種の丸め誤差が避けられないこと、そして浮動小数点数が等しいかテストするのは望ましくないことがピーターにはわかっています。

テストを強化してエラーを示す

バグが見つかるということは、単体テストに穴があったか、またはテストがユーザーの実際のニーズに合致していないということです。 したがって、バグを修正する前に、ピーターはこのエラーの存在を示すテストを追加します。

 
        // Added 2012-02-02 for bug 654321:
        /// <summary>
        /// Make sure that number equality test allows for 
        /// small rounding errors.
        /// </summary>
        [TestMethod]
        public void TestDoublesEqual()
        {
            // We allow a rounding error of 1 in 1000000:
            TestEqual(1, 1e-7, true); // Less than allowed error
            TestEqual(1, 1e-5, false); // More than allowed error
            TestEqual(1000, 1e-7, true); // Less than allowed error
            TestEqual(1000, 1e-5, false); // More than allowed error
        }
        private void TestEqual(double value, double error, bool result)
        {
            // Try different combinations of error and value:
            Assert.IsTrue(result == LocalMath.EqualTo(value + error, value));
            Assert.IsTrue(result == LocalMath.EqualTo(value, value + error));
            Assert.IsTrue(result == LocalMath.EqualTo(value - error, value));
            Assert.IsTrue(result == LocalMath.EqualTo(value, value - error));
        }

テストを実行すると、予想どおり失敗します。

等価テストの失敗を示す単体テスト エクスプローラー

テストに合格するように修正する

ピーターはコードを次のように修正します。

        public static bool EqualTo(double a, double b)
        {
            // Allow for rounding errors.
            // For example, a == 2.0 and b = 1.99999999999

            const double allowedError = 1/1000000;
            return System.Math.Abs(a - b) < allowedError;
        }

今度はテストに合格します。

等価テストの成功を示す単体テスト エクスプローラー

コード レビューを依頼する

ピーターはバグの修正に満足していますが、自分の作業をまだチェックインしていません。 チームでは、コード レビューを活用して、全体的なコード品質を高め、バグを出すリスクを軽減しています。そこでピーターは、チーム エクスプローラーを使用して、チーム メイトのジュリアとアダムにコード レビューを依頼します。

コード レビューを依頼するには

My Work page - Request Review link. New Code Review page - Enter the name of a reviewer dropdown, Enter a description (optional) textbox, Submit Request button.

  1. チーム エクスプローラー[担当作業] ページで、[レビューの要求] をクリックします。

    [新しいコード レビュー] ページが表示されます。

  2. レビューアー レビュー担当者を指定します (複数可)。

  3. コード レビュー レビューの名前を指定します。

  4. 区分パス ビルド パスを指定します。

  5. コメント レビュー担当者宛てのコメントを指定します。

  6. [要求の送信] をクリックします。

レビュー担当者には、要求があったことが電子メールで通知されます。

中断されている作業、シェルブセット、または変更セットのコード レビューも依頼できます。 変更セットの一覧を表示するには、ソース管理エクスプローラーを開き、[履歴] をクリックします。

コード レビューを受諾または拒否する

ジュリアは、コード レビュー依頼を受け取り、引き受けます。 コードをレビューして、ファイル ブロックおよびコード ブロック レベルでコメントを記述し、コード レビューをピーターに返信します。 アダムは忙しいため、コード レビューを断りました。

コメントで、ジュリアはテストが誤っていることを指摘しました。 許容誤差は、定数値ではなく、入力値に対する指定の割合とする必要があります。 そのため、テストでは誤差と入力値を乗算する必要があります。

            // We allow a rounding error of 1 in 1000000
            // as a fraction of the value:
            TestEqual(1, 1e-7, true); // Less than allowed error
            TestEqual(1, 1e-5, false); // More than allowed error
            TestEqual(1000, 1000*1e-7, true); // Less than allowed error
            TestEqual(1000, 1000*1e-5, false); // More than allowed error

ヒント

チーム メンバーは、話し合いの焦点としてテストを使用しています。テストが正しく十分である場合、コードもそうなります。コードとは異なり、テストはそれぞれ別のケースを表しています。そのため、多くの場合、テストについて話し合う方がコードについて話し合うより簡単です。

コード レビューを実行するには

My Work page - code review item. Code Review page - Decline link, Comment, Decline button.Diff window. Code Review page - Accept link, Overall comment, code block comment

  1. チーム エクスプローラー[担当作業] ページで、[マイ コードのレビューと要求] セクションに移動し、要求を開きます。

  2. [コード レビュー] ページでは、以下の操作を実行できます。

    • [同意する] または [同意しない] を選択して、レビューを行うかどうかを作成者に通知します。

    • [レビューアーの追加] をクリックして、他のレビュー担当者をコード レビュー要求に追加します。

    • この作業項目用に更新された各ファイルの変更内容を表示します。

    • [コメント] を展開して、作成者および他のレビュー担当者と変更について話し合います。

      • [全般コメントの追加] をクリックします。

        または

        コード ブロックを選択し、ショートカット メニューの [コメントの追加] をクリックします。

      • [コメントの送信] をクリックして、作成者および他のレビュー担当者にコメントが表示されるようにします。
    • [送信して完了] をクリックして、コードにさらに作業が必要かを示してレビューを完了します。

コード レビューに応答する

ピーターはジュリアからコード レビューを受け取り、応答します。

コード レビューに応答するには

コードのレビュー担当者と作成者は何度でもコメントをやり取りすることができます。 レビューが終了するのは、作成者がレビューを閉じたときです。 話し合いに新しい内容が加わるたびに、他の参加者に電子メールで通知されます。

My Work page - code review item. Code Review page - Overall comment, file comment, Close Review link.

  1. チーム エクスプローラー[担当作業] ページで、[マイ コードのレビューと要求] セクションに移動し、要求をダブルクリックします。

    また、要求のショートカット メニューを開き、[開く] をクリックすることもできます。

  2. コメントを読み、必要に応じて返信します。 コメントに返信するには、[返信] をクリックし、表示されるボックスにコメントを入力して、[OK] をクリックします。 コメントを送信するには、[コメントの送信] をクリックします。

  3. ファイルを表示してコメントを含むコード ブロックを確認するには、またはファイルを編集するには、[コメント] セクションに移動します。 [ファイル] サブセクションで、ファイルのショートカット メニューを開き、[比較 (読み取り専用) ] または [ファイルの編集] をクリックします。

  4. 自分と他のレビュー担当者との間で互いのコメントに対する応答が終了して、レビューを閉じる準備が整ったときは、[レビューを閉じる] をクリックして、次のいずれかを選択します。

    • [完了] はレビューが終了したことを示します。

    • または

    • [破棄] はレビューを取り消すことを示します。

テストとコードを修正する

ジュリアのコメントを読んだピーターは、その内容に従って単体テストを修正します。 今度はテストが失敗します。 これはコードがまだ正しくないことを示しています。

ピーターはコードを次のように修正します。

        /// <summary>
        /// Returns true if two numbers are equal.
        /// </summary>
        public static bool EqualTo(double a, double b)
        {
            // Allow for rounding errors.
            const double allowedErrorMultiple = 1/1000000;
            double allowedError = (System.Math.Abs(a) + System.Math.Abs(b)) * allowedErrorMultiple/2;
            return System.Math.Abs(a - b) < allowedError;
        }

再びテストに合格します。

等価テストの成功を示す単体テスト エクスプローラー

ヒント

バグを修正するときは、コード開発時と同じ手順に従います。失敗するテストを記述した後、テストに合格するようにコードを修正します。テストに合格した場合にだけ、コードとテストをチェックインします。

ピーターは、今度はバグが検出されたテスト ケースに注意を向けます。 バグを再現する手順は、テスト ケース作業項目に明確に記述されています。 ピーターは手順に従って、請求書が正しく表示されることを確認します。

修正をチェックインする

ピーターは、修正したコードと単体テストをチェックインします。 バグの状態は [解決済み] に自動的に設定され、[担当者] の値は、バグを検出したテスト チームのメンバーに自動的に再度割り当てられます。 そのチーム メンバーが、バグが修正されたことを確認して、作業項目を閉じます。

修正をチェックインするには

バグを修正するための更新プログラムのチェックイン

  1. チーム エクスプローラー[担当作業] ページで、[チェックイン] をクリックします。

  2. [保留中の変更] ページで以下を確認します。

    • [含まれる変更] ボックスにすべての該当する変更が表示されていること。

    • [関連作業項目] ボックスにすべての該当する作業項目が表示されていること。

  3. 変更されたファイルとフォルダーのバージョン管理履歴をみたときにチームがこの変更の目的を理解できるように、[コメント] ボックスに説明を入力します。

  4. [チェックイン] を選択します。

タスクの作業を再開する

ピーターはタスクの作業を再開します。 コード変更はすべて、開いているウィンドウやブレークポイント、ウォッチ ウィンドウ変数のような重要な各種状態と共に、自分のワークスペースに復元されるため、作業にすぐに戻ることができます。

タスクの作業を再開するには

タスクの再開と完了

  • チーム エクスプローラー[担当作業] ページで、[中断およびシェルブされた作業] ボックスを見つけます。 項目のショートカット メニューを開きます。 選択肢は 2 つあります。

    • 中断中の作業を再開し、自分のワークスペースで現在保留中の変更はすべて自動的に中断する場合は、[再開] をクリックします。

    • ワークスペースに既にある保留中の変更を中断中の作業にマージする場合は、[処理中とマージ] をクリックします。

作業を再開したとき

作業項目を中断すると影響を受けるペイン。

作業を再開すると、Visual Studio は以下の項目を復元します。

  • 自分の開いているソリューション

  • 自分のコード変更

  • 開いているウィンドウの状態と位置

  • ブレークポイント

  • ウォッチ ウィンドウの変数と式

  • ブックマーク

バグが消滅したことの確認

テスト チームでバグが見つかった場合は、いくつかのテスト ケースをバグにリンクさせて再実行します。 詳細については、こちらを参照してください。