ALM 開發人員的一日生活 : 暫停工作、修復 Bug 和進行程式碼檢閱 (Code Review)

各位夥伴們,

常常在一些研討會中,有來賓問到,一個在 ALM 平台上運作的團隊,其開發成員每日工作大致長什麼樣子?  當然每個團隊所遇到的狀況不同,也不一定要依照以下流程進行,但此文章大致描述了一個開發人員的一天,當發現了一個bug,如何提交到 Team Foundation Server (TFS) 或 Visual Studio Online 中,讓開發人員可以進行修復,修復完成後如何要求同仁進行 Code Review,並進行測試。

微軟開發工具產品經理 Dann Wu 吳典璋

-----------------------------------------------------------------------------------------------------

Visual Studio Premium 和 Visual Studio Ultimate 中透過 Team Foundation Server 提供了只要按一下的強大切換方式,可讓您將工作內容從某個工作執行緒切換至另一個執行緒。 此外,小組成員也可以輕鬆交換有關程式碼變更建議的訊息。 本主題將說明這些功能,接著提供的教學課程將跟隨虛擬的敏捷式小組成員度過一天。

Peter 忙於撰寫一些程式碼來完成一項待處理項目工作。不過,他的同事發現了阻礙進度的 Bug,他想要立即修正它。 他暫止正在進行的工作並修正 Bug。 然後他請 Julia 檢閱修正結果,並且在檢閱之後簽入修正,再繼續處理原本正在進行的工作。

注意事項注意事項

Peter 使用的 [我的工作] 和 [程式碼檢閱] 功能只能在 Visual Studio Premium 和 Visual Studio Ultimate 中使用。

本主題內容

1. 暫止目前的工作

 

當 Peter 處理待處理項目時,Julia 前來討論阻礙進度的 Bug。 它位於 Peter 熟悉的區域,所以他建立了修正 Bug 的工作並將它指派給自己。 他決定立即開始進行修正。

在開始處理新的 Bug 之前,Peter 想要確定目前的工作處於小組伺服器上的安全位置。 在 [我的工作] 頁面上,Peter 選擇 [暫止] 進行儲存 (在 Team Foundation Server 上):

  • 他完成的所有工作,包括對程式碼、測試及其他檔案的變更。

  • 開啟方案、視窗、中斷點、監看式視窗變數,以及其他相關的 Visual Studio 狀態。

現在 Peter 的工作區是乾淨的,他從 [可用的工作項目] 將新工作拖曳至 [進行中的工作]。 他已準備好研究並撰寫修正。

注意事項注意事項

您使用中的內容會連結至 [我的工作] 頁面上顯示為 [進行中] 的工作項目。 您可以使用 [暫止] 和 [繼續],快速切換不同的工作。 開啟的方案和檔案、程式碼變更及 Visual Studio 配置全都會一起切換。

Hh474795.collapse_all(zh-tw,VS.120).gif若要暫止目前的工作並開始處理不同的工作

暫停某些工作

  1. 連接:如果您尚未連接至要處理的 Team 專案,請連接到 Team 專案

    1. 在 [Team Explorer] 中,選擇 [首頁],然後選擇 [我的工作]。
  2. 暫止目前的工作:

    1. 在 [進行中的工作] 區段中,選擇 [暫止]。

    2. 在出現的方塊中,指定要提供給這組暫止工作的名稱,然後選擇 [暫止] 按鈕。 預設名稱是您目前正在進行中的工作項目。

  3. 開始處理新工作、Bug 或其他工作項目:

    1. 在選取工作項目之前,您可能要:

      • 選擇 [可用的工作項目] 底下的 [新增],建立新工作或其他工作項目,或者

      • 在 [可用的工作項目] 底下選取不同的查詢。

    2. 將工作項目從 [可用的工作項目] 拖曳至 [進行中的工作]。

      或者,您也可以從 [暫停的工作] 底下將先前暫停的工作項目拖曳出來,以便切換至該工作項目。

提示提示

目前 [進行中] 的工作項目會與您目前的程式碼變更和 Visual Studio 狀態連結。 若要讓 Visual Studio 協助您組織工作,當您在工作之間切換時,請確定適當的項目處於 [進行中] 狀態。

2. 調查 Bug

 

Peter 開啟並讀取 Bug 工作項目。 根據測試小組成員撰寫的描述,已支付發票有時會誤標為未支付。 Bug 工作項目有附加的實驗室環境快照。 Peter 可以開啟測試執行所在的虛擬機器、查看不正確的發票,以及回頭檢查 IntelliTrace 記錄檔。 他追蹤錯誤來到下列方法:

 

 

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

從 IntelliTrace 記錄檔中,Peter 看見方法有時會因為參數有極小的差異而傳回 false。 Peter 清楚這類進位錯誤在浮點算術中無法避免,而且測試浮點數是否相等並非理想的做法。

Hh474795.collapse_all(zh-tw,VS.120).gif擴大測試以顯示錯誤

當發現 Bug 時,它會顯示在單元測試中有落差,或者測試不符合使用者的實際需求。 因此,在修正 Bug 之前,Peter 增加了一項測試,該測試將會示範這個錯誤。

 

 

  
        // 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));
        }

他執行測試,並且測試一如預期地失敗。

顯示失敗之測試的 [單元測試總管],這些測試是比較是否相同的測試。

Hh474795.collapse_all(zh-tw,VS.120).gif讓測試成功

Peter 修正程式碼:

 

 

         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;
        }

現在測試會成功:

顯示成功之測試的 [單元測試總管],這些測試是比較是否相同的測試。

3. 要求程式碼檢閱

 

Peter 對於 Bug 修正的結果感到滿意,但尚未簽入他的工作。 他的小組使用程式碼檢閱將整體程式碼品質提高並減少建立更多 Bug 的風險,因此 Peter 使用 Team Explorer 要求組員 Julia 和 Adam 進行程式碼檢閱。

Hh474795.collapse_all(zh-tw,VS.120).gif若要要求程式碼檢閱

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. 在 [Team Explorer] 的 [我的工作] 頁面上,選擇 [要求檢閱]。

    [新增程式碼檢閱] 頁面隨即出現。

  2. 檢閱者 指定一位或多位檢閱者。

  3. 程式碼檢閱 指定檢閱的名稱。

  4. 區域路徑 指定區域路徑。

  5. 註解 指定給檢閱者的註解。

  6. 選擇 [送出要求]。

檢閱者將會收到要求的電子郵件通知。

您也可以要求對暫止的工作、擱置集或變更集進行程式碼檢閱。 若要查看變更集的清單,請開啟 [原始檔控制總管] 並選擇 [記錄] 按鈕。

4. 接受或拒絕程式碼檢閱

 

Julia 會收到程式碼檢閱要求並接受要求。 她會檢閱程式碼,在文件和程式碼區塊層級撰寫一些註解,然後將程式碼檢閱送回給 Peter。 Adam 太忙碌而無法檢視程式碼,因此會拒絕要求。

Julia 在註解中指出測試錯誤。 允許的錯誤應該是指定的輸入值分數,而不是常數數量。 因此測試應該將錯誤乘以值。

 

 

             // 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

提示提示

請注意,小組成員會使用測試做為討論的焦點。 如果測試正確且已足夠,程式碼也將如此。 與程式碼不同的是,每項測試都代表一個獨立的案例。 因此,測試通常比程式碼容易進行討論。

Hh474795.collapse_all(zh-tw,VS.120).gif若要執行程式碼檢閱

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. 在 [Team Explorer] 的 [我的工作] 頁面上,移至 [我的程式碼檢閱與要求] 區段並開啟要求。

  2. 在 [程式碼檢閱] 頁面上,您可以:

    • 選擇 [接受] 或 [拒絕] 以通知作者您是否要執行檢閱。

    • 選擇 [加入檢閱者] 將其他檢閱者加入至程式碼檢閱要求。

    • 檢視針對此工作項目更新之每個檔案的變更。

    • 展開 [註解],與作者及其他檢閱者討論變更。

      • 選擇 [加入整體註解]

        -或-

        選取程式碼區塊,然後從捷徑功能表選擇 [加入註解]。

      • 選擇 [傳送註解],讓作者和其他檢閱者看得見您的貢獻。
    • 選擇 [傳送並完成] 完成您的檢閱,並指出程式碼是否需要進行更多處理。

5. 回應程式碼檢閱

 

Peter 收到來自 Julia 的程式碼檢閱並予以回應。

Hh474795.collapse_all(zh-tw,VS.120).gif若要回應程式碼檢閱

程式碼的檢閱者和作者可以隨心所欲地多次交換註解。 當作者關閉檢閱時,檢閱就會結束。 有其他討論內容時,會透過電子郵件通知其他參與者。

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

  1. 在 [Team Explorer] 的 [我的工作] 頁面上,移至 [程式碼檢閱與要求] 區段並按兩下要求。

    您也可以開啟要求的捷徑功能表,並選擇 [開啟]。

  2. 讀取註解並依需要回覆。 若要回覆註解,請選擇 [回覆],在出現的方塊中輸入您的註解,然後選擇 [確定]。 若要傳送您的註解,請選擇 [傳送註解]。

  3. 若要檢視檔案並查看具有註解的程式碼區塊,或是編輯檔案,請移至 [註解] 區段。 在 [檔案] 子區段中,開啟檔案的捷徑功能表,並選擇 [比較 (唯讀)] 或 [編輯檔案。]。

  4. 當您和其他檢閱者完成回應彼此的註解,並且準備好要結束檢閱時,請按一下 [關閉檢閱],然後選擇:

    • [完成],表示檢閱已完成。

    • -或-

    • [放棄],表示您取消檢閱。

6. 修正測試和程式碼

 

讀取 Julia 的註解後,Peter 依據她的建議修正單元測試。 現在測試失敗。 這表示程式碼還是不正確。

Peter 修正程式碼:

 

 

         /// <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;
        }

測試再次成功:

顯示成功之測試的 [單元測試總管],這些測試是比較是否相同的測試。

提示提示

若要修正 Bug,請依照程式碼開發中的做法進行。 撰寫一項會失敗的測試,然後讓測試成功。 只有在測試成功時,才簽入程式碼和測試。

Peter 現在注意到發現 Bug 的測試案例。 重現 Bug 的步驟在測試案例工作項目中有清楚的描述。 他依照這些步驟進行,並發現發票內容正確列出。

7. 簽入修正

 

Peter 簽入了修正的程式碼和單元測試。 Bug 的狀態會自動設定為 [已解決],而且 [指派給] 值會自動重新指派給發現 Bug 的測試小組成員。 該小組成員將確認 Bug 已修正並關閉工作項目。

Hh474795.collapse_all(zh-tw,VS.120).gif若要簽入修正

簽入更新以修正 Bug

  1. 在 [Team Explorer] 的 [我的工作] 頁面上,選擇 [簽入]。

  2. 檢閱 [暫止的變更] 頁面的內容,以確定:

    • 所有相關的變更都在 [包含的變更] 中列出

    • 所有相關的工作項目都在 [相關工作項目] 中列出。

  3. 指定 [註解],在您的小組查看已變更檔案和資料夾的版本控制記錄時,幫助其了解這些變更的目的。

  4. 選擇 [簽入]。

8. 繼續處理工作

 

Peter 繼續處理他的工作。 他能夠快速回到工作,是因為他所有的程式碼變更連同重要的狀態部分 (例如開啟的視窗、中斷點、監看式視窗變數) 都已一併還原到他的工作區。

Hh474795.collapse_all(zh-tw,VS.120).gif若要繼續處理工作

繼續並完成工作

  • 在 [Team Explorer] 的 [我的工作] 頁面上,尋找 [已暫停且擱置的工作] 清單。 開啟項目的捷徑功能表。 您有兩種選擇:

    • 如果要繼續執行暫停的工作並自動暫停工作區中任何暫止的變更,請選擇 [繼續]。

    • 如果您想要將暫停的工作與工作區中已存在的暫止變更合併,請選擇 [與進行中項目合併]。

Hh474795.collapse_all(zh-tw,VS.120).gif當您繼續工作

暫停工作項目時受到影響的窗格。

當您繼續工作時,Visual Studio 會還原:

  • 開啟的方案

  • 程式碼變更

  • 開啟視窗的狀態和位置

  • 中斷點

  • 監看式視窗變數和運算式

  • 書籤

[延伸閱讀]

ALM 開發人員的一日生活:為使用者劇本撰寫新程式碼