程式碼重構與單元測試——重構1的單元測試(四)

 
 

四、重構1的單元測試

       程式開發過程中,寫程式碼是為了實現需求。當我們的程式碼通過了編譯,只是說明它的語法正確,功能能否實現則不能保證。 因此,當我們的某些功能程式碼完成後,為了檢驗其是否滿足程式的需求。可以通過編寫測試程式碼,模擬程式運行的過程,檢驗功能程式碼是否符合預期。

      單元測試就是開發者編寫一小段程式碼,檢驗目標程式碼的功能是否符合預期。通常情況下,單元測試主要面向一些功能單一的模組進行。

      舉個例子:一部手機有許多零部件組成,在正式組裝一部手機前,手機內部的各個零部件,CPU、記憶體、存儲、電池、攝影機、按鍵等,都要進行測試,這就是單元測試。

      單元測試實際上就是一些「斷言」(assert)程式碼。斷言就是判斷一個方法或對象的一個方法所產生的結果是否符合你期望的那個結果。單元測試中,一般使用assert來判斷結果,如果表達式為真則通過,如果表達式為假會發生異常。

     在 程式碼重構與單元測試——「提取方法」重構(三)  的文章中我們已經進行了「提取方法」重構,今天我們要寫一個測試用例,然後執行一下單元測試,來看看我們之前的「提取方法」重構是否正確,重構之後是否產生了新的bug。

     接下來我們針對兩個新的方法創建兩個測試方法,進行單元測試,把對結果檢查的工作交給單元測試中的斷言來做。

1. 我們在測試項目LeasePowerBankTest中找到UnitTest1.cs測試類文件,然後在此文件的頂部添加 如下程式碼語句,供測試項目調用。程式碼如下:

using LeasePowerBank;

     對測試類的最低要求有:

      1)任何包含要在「測試資源管理器」中運行的單元測試方法的類都需要有 [TestClass] 特性。

      2)需要「測試資源管理器」識別的每個測試方法都必須具有 [TestMethod] 屬性。

      3)單元測試項目中可以具有不含 [TestClass] 特性的其他類,測試類中可以具有不含 [TestMethod] 特性的其他方法。 可以從測試方法中調用這些其他的類和方法。

在此過程中,編寫單元測試方法以驗證 Customer類的 GetAmount方法的行為。

     我們的單元測試,至少需要檢查兩種行為:

    如果計費金額小於應有金額,該方法會引發 ArgumentOutOfRangeException。

    如果計費金額等於應有金額,則斷言成功。

     測試方法必須滿足以下要求:

       1)使用 [TestMethod] 特性進行修飾。

       2)它將返回 void 。

       3) 它不能含有參數。

2. 對GetAmount的單元測試方法程式碼如下:

        [TestMethod]
        public void ValidGetAmountTest()
        {
            
            double expected = 5;
            //創建用戶
            var customer = new Customer("張三");
            //創建充電寶
            PowerBank regularPowerBank = new PowerBank("低-充電寶", PowerBank.LowTraffic);
 

            //創建租賃數據
            var rental1 = new Rental(regularPowerBank, 5);
            // Act
            decimal actual = customer.GetAmount(rental1);
            // Assert
  
            Assert.AreEqual(expected,actual,0.001, "總金額計算錯誤");
        }

3. 對ValidGetFrequentRenterPointsTest的單元測試方法程式碼如下:

        [TestMethod]
        public void ValidGetFrequentRenterPointsTest()
        {

            int expected = 5;
            //創建用戶
            var customer = new Customer("張三");
            //創建充電寶
            PowerBank regularPowerBank = new PowerBank("低-充電寶", PowerBank.LowTraffic);

            //創建租賃數據
            var rental1 = new Rental(regularPowerBank, 5);

            // Act
            int actual = customer.GetFrequentRenterPoints(0,rental1,5);
            // Assert
            Assert.AreEqual(expected, actual, 0.001, "積分計算錯誤");
        }

 

4. 在Visual Studio 2019的菜單欄上找到 「生成」 菜單,選擇 「生成解決方案」 。如下圖。

 

5. 在Visual Studio 2019的菜單欄上找到「測試–>運行所有測試」菜單項。或者在「測試資源管理器中」選擇 「在視圖中運行所有測試」按鈕, 以運行測試。如下圖。

 

6.測試運行時,「測試資源管理器」窗口頂部的狀態欄呈動態 。 測試運行結束時,如果測試方法全部通過,狀態欄將變為綠色。如下圖。

 

7. 我們將ValidGetAmountTest方法修改如下。

  [TestMethod]
        public void ValidGetAmountTest()
        {

           double expected = 6;
            //創建用戶
            var customer = new Customer("張三");

            //創建充電寶
            PowerBank regularPowerBank = new PowerBank("低-充電寶", PowerBank.LowTraffic);

            //創建租賃數據
            var rental1 = new Rental(regularPowerBank, 5);

            // Act
            double actual = (double)customer.GetAmount(rental1);
            // Assert    

            Assert.AreEqual(expected,actual,0.001, $"總金額計算錯誤,實際計算金額{actual},期望金額:{expected}");

        }

      8.在這種情況下,我們再次通過「測試–>運行所有測試」運行測試,結果有一個測試失敗。如下圖。在「測試資源管理器」 中選擇該方法,可在「測試詳細資訊摘要」窗口查看詳細資訊。

 

Tags: