快速入門:搭配測試總管進行以測試為導向的開發工作
我們建議您建立單元測試可協助您透過許多步驟加入開發,繼續執行程式碼正確工作。 您可以使用撰寫單元測試的數種架構,包含由協力廠商所開發的陣列。 某些測試架構專門以不同的語言或平台為測試。 測試總管在任何這些框架中對單元測試提供一個介面。 配接器隊最常用的框架是可用的,然後您可以將其他框架撰寫配接器。
測試總管取代 Visual Studio 的舊版中的單元測試視窗。 它的優點包括:
使用單一介面執行 .NET,未處理,資料庫和其他測試類型。
使用您的選項,例如 NUnit 或框架 MSTest 單元測試架構。
請參閱在一個視窗中通常需要的所有資訊。 詳細資訊可以在 [屬性] 視窗中找到。
使用測試總管
您可以使用測試總管,執行單元測試
建立使用您選擇的測試架構的單元測試。
例如,使用 MSTest Framework 的測試:
建立測試專案
在[ 新增專案] 對話方塊中, 展開 [Visual Basic]、[ Visual C#] ,或是[ Visual C++], 接著選取[測試]。
選取 [單元測試專案]。
將每個單元測試做為方法。 在每個測試方法的前面加上 [TestMethod] 屬性。
在功能表列上,選取 [測試], [執行單元測試], [所有測試]。
方案建置和執行測試。
測試總管開啟並顯示測試結果。
若要檢視測試完整清單: 選取任何分類的 [全部顯示] 。
若要回到摘要,請選取 [首頁] 檢視。
若要檢視測試結果的詳細資料: 選取測試總管中的測試。 詳細資料,例如例外狀況訊息會出現在詳細資料窗格中。 您也可以在 [屬性] 視窗中看到詳細資訊。
巡覽至測試的程式碼: 按兩下測試總管的測試或從捷徑功能表中選擇 [開啟測試] 。
偵錯測試: 開啟一個或多個測試的捷徑功能表,然後選取 [偵測選取的測試]。
重要
顯示的結果是最近執行的結果。色彩的結果列顯示正在執行的測試結果。例如,如果您執行許多測試,但是某些失敗,然後只執行成功的測試,然後結果列所有會顯示綠色。
注意事項 |
---|
如果測試未出現,請確定已安裝配接器去連接測試總管至您使用的測試架構。如需詳細資訊,請參閱 使用與測試總管中不同的測試架構。 |
逐步解說:使用開發的單元測試方法。
使用 Microsoft 單元測試架構,本逐步解說示範如何在 C# 開發一個要測試的方法。 您可以輕鬆地讓它與其他語言的和使用其他測試架構,例如 NUnit。 如需詳細資訊,請參閱 使用不同的測試架構。
建立測試和方法。
建立一個Visual C# 類別庫專案。 這個專案將會包含您想要提供的程式碼。 在此範例中,它的名稱是 MyMath。
建立測試專案
在 [新增專案] 對話方塊中,選取 [Visual C#][測試] ,然後選取 [單元測試專案]。
撰寫基本測試方法。 驗證特定輸入的結果:
[TestMethod] public void BasicRooterTest() { // Create an instance to test: Rooter rooter = new Rooter(); // Define a test input and output value: double expectedResult = 2.0; double input = expectedResult * expectedResult; // Run the method under test: double actualResult = rooter.SquareRoot(input); // Verify the result: Assert.AreEqual(expectedResult, actualResult, delta: expectedResult / 100); }
產生要測試的方法。
將游標置於 Rooter,然後在捷徑功能表中選擇[產生], [新增型別]。
在 [新增型別] 對話方塊中,將 [專案] 設至類別庫專案。 在這個範例中,它是設定為 MyMath。
將游標置於 SquareRoot,然後在捷徑功能表中選擇[產生], [新增型別]。
執行單元測試
在功能表列上,選取 [測試], [執行單元測試], [所有測試]。
建置並執行方案。
測試總管會開啟並顯示測試結果。
測試隨即出現在 [失敗的測試] 之下:
選取測試的名稱。
測試的詳細資料會顯示在測試總管下半部。
選取項目在 [堆疊追蹤] 底下去看這個測試失敗的位置。
此時,您會建立您要修改的測試和 Stub,讓測試成功。
在每次變更,讓所有的測試都通過以後
在 MyMath \ Rooter.cs,改善SquareRoot的程式碼:
public double SquareRoot(double input) { return input / 2; }
在[測試總管] 中,選取 [全部執行]。
程式碼組建和測試。
測試就會成功。
將測試擴充輸入的範圍
改善在所有情況下您程式碼的工作,或者嘗試各種輸入值的信賴等級。
提示
避免改變已經存在的成功測試。相反地,請加入新的測試。只有在使用者的需求改變時,將現有的測試改變。這個原則可協助您確保不會中斷現有的功能,並且在工作擴充程式碼。
在測試類別中,加入下列測試,嘗試輸入值的範圍:
[TestMethod] public void RooterValueRange() { // Create an instance to test: Rooter rooter = new Rooter(); // Try a range of values: for (double expectedResult = 1e-8; expectedResult < 1e+8; expectedResult = expectedResult * 3.2) { RooterOneValue(rooter, expectedResult); } } private void RooterOneValue(Rooter rooter, double expectedResult) { double input = expectedResult * expectedResult; double actualResult = rooter.SquareRoot(input); Assert.AreEqual(expectedResult, actualResult, delta: expectedResult / 1000); }
在[測試總管] 中,選取 [全部執行]。
新的測試失敗,不過,第一個測試仍然可以成功。
若要找出問題的失敗,請選取失敗的測試,並在測試總管下半部,選取 [堆疊追蹤] 的最上層項目。
檢查待測方法看看可能是錯誤的東西。 在 MyMath.Rooter 類別,請重寫程式碼:
public double SquareRoot(double input) { double result = input; double previousResult = -input; while (Math.Abs(previousResult - result) > result / 1000) { previousResult = result; result = result - (result * result - input) / (2 * result); } return result; }
在[測試總管] 中,選取 [全部執行]。
兩個測試都成功。
為例外狀況加入測試
為負面輸入加入測試:
[TestMethod] public void RooterTestNegativeInputx() { Rooter rooter = new Rooter(); try { rooter.SquareRoot(-10); } catch (ArgumentOutOfRangeException e) { return; } Assert.Fail(); }
在[測試總管] 中,選取 [全部執行]。
測試回路底下的方法,必須手動移除。
選擇 [取消]。
測試停止在 10 秒鐘之後。
內建方法程式碼:
public double SquareRoot(double input) { if (input <= 0.0) { throw new ArgumentOutOfRangeException(); } ...
在[測試總管] 中,選取 [全部執行]。
所有測試都成功。
重構,且不會變更測試。
簡化程式碼,但是,請不要變更測試。
提示
重構 是要讓程式碼更好執行或讓程式碼更容易了解的變更。不要變更程式碼的行為,也未變更測試。
建議您分別執行重構步驟與擴充功能的步驟。將測試保持未變更,當重構時為您確定您沒有不小心引入 Bug。
public class Rooter { public double SquareRoot(double input) { if (input <= 0.0) { throw new ArgumentOutOfRangeException(); } double result = input; double previousResult = -input; while (Math.Abs(previousResult - result) > result / 1000) { previousResult = result; result = (result + input / result) / 2; //was: result = result - (result * result - input) / (2*result); } return result; } }
選擇 [全部執行]。
所有測試仍然可以成功。