四、重構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.在這種情況下,我們再次通過“測試-->執行所有測試”執行測試,結果有一個測試失敗。如下圖。在“測試資源管理器” 中選擇該方法,可在“測試詳細資訊摘要”視窗檢視詳細資訊。