本文介紹如何在Visual Studio中對通用 Windows 平臺 (UWP) 應用程式進行單元測試。 Visual Studio 提供適用於 C#、Visual Basic 和 C++ 的 UWP 單元測試專案範本。 有關開發 UWP 應用的詳細資訊,請參閱 UWP 應用入門。
本文介紹了在UWP應用程式中創建 C# 類並對其進行單元測試的範例。 該示例使用 測試驅動開發 來編寫驗證特定行為的測試,然後編寫通過測試的代碼。
創建並運行單元測試專案
以下過程介紹如何為UWP應用創建和運行單元測試專案。
創建UWP單元測試專案
在 Visual Studio Start(Visual Studio 開始 )視窗中,選擇 Create a new project(創建新專案)。
在 Create a new project (創建新項目 ) 頁面上,在 Search (搜尋) 框中輸入 unit test 。 範本清單篩選到單元測試專案。
為 C# 或 Visual Basic 選擇正確的 UWP 單元測試範本,然後選擇 “下一步”。
從 Visual Studio 2022 版本 17.14 開始,C# 和 .NET 9 的推薦單元測試範本是 UWP 單元測試應用 ,面向本機 AOT。 較舊的 UWP 範本名為 UWP 單元測試應用程式 (.NET Native) 和單元測試應用程式 (Universal Windows)。
(可選)更改專案或解決方案的名稱和位置,然後選擇 Create ( 創建)。
(可選)更改目標和最低平臺版本,然後選擇 確定。
Visual Studio 將創建測試專案,並在 Visual Studio 解決方案資源管理器中打開它。
在 Visual Studio Start(Visual Studio 開始 )視窗中,選擇 Create a new project(創建新專案)。
在 Create a new project (創建新項目 ) 頁面上,在 Search (搜尋) 框中輸入 unit test 。 範本清單篩選到單元測試專案。
選擇適用於 C# 或 Visual Basic 的 Unit Test App (Universal Windows) 範本,然後選擇 Next。
(可選)更改專案或解決方案的名稱和位置,然後選擇 Create ( 創建)。
(可選)更改目標和最低平臺版本,然後選擇 確定。
Visual Studio 將創建測試專案,並在 Visual Studio 解決方案資源管理器中打開它。
編輯專案的應用程式清單
在 「解決方案資源管理器」中,右鍵按兩下 Package.appxmanifest 檔,然後選擇「 打開」。
在清單設計器中,選擇 Capabilities (功能 ) 選項卡。
在 Capabilities (功能 ) 清單中,選擇代碼和單元測試所需的功能。 例如,如果您的代碼及其單元測試需要訪問 Internet,請選中 Internet 複選框。
僅選擇單元測試正常運行所需的功能。
添加代碼以對 UWP 應用進行單元測試
在 Visual Studio 程式碼編輯器中,編輯單元測試代碼檔以添加測試所需的斷言和邏輯。 有關範例,請參閱本文後面 的 C# 類的單元測試 。
使用 Test Explorer 運行單元測試
使用 Test Explorer 構建解決方案並運行單元測試。
在 Visual Studio 的「測試 」功能表上,選擇 「測試資源管理器」。。 [測試總管] 視窗隨即開啟。
在 Test Explorer 中,選擇 Run all 圖示。 您必須使用 Run all 來發現 UWP 專案中的測試。
解決方案生成並運行單元測試。 測試運行后,測試將顯示在 Test Explorer 測試清單中,其中包含有關結果和持續時間的資訊。
此外,在 測試資源管理器中,您可以選擇單個測試並右鍵按兩下以 運行 或 除錯 測試 ,或右鍵按兩下 以打開測試代碼。 在頂部選單中,您可以對測試進行分組、將測試添加到播放清單或打開測試選項。
使用 Test Explorer 構建解決方案並運行單元測試。
在 Visual Studio 的「測試 」功能表上,選擇 「測試資源管理器」。。 [測試總管] 視窗隨即開啟。
在 Test Explorer 中,選擇 Run all 圖示。 您必須使用 Run all 來發現 UWP 專案中的測試。
解決方案生成並運行單元測試。 測試運行后,測試將顯示在 Test Explorer 測試清單中,其中包含有關結果和持續時間的資訊。
此外,在 測試資源管理器中,您可以選擇單個測試並右鍵按兩下以 運行 或 除錯 測試 ,或右鍵按兩下 以打開測試代碼。 在頂部選單中,您可以對測試進行分組、將測試添加到播放清單或打開測試 選項。
對 C# 類進行單元測試
一組穩定的良好單元測試可以增強您在更改代碼時沒有引入bug的信心。 以下示例介紹了在UWP應用中為 C# 類創建單元測試的一種方法。 該示例使用 測試驅動開發 來編寫驗證特定行為的測試,然後編寫通過測試的代碼。
在示例 Maths 代碼專案中, Rooter 類實現一個計算數位的估計平方根的函數。 RooterTests 專案單元測試 Rooter 類。
創建解決方案和專案
建立 UWP 應用專案:
- 在 Visual Studio 的「檔 」功能表上,選擇 「新建專案」。
- 在 Create a new project (創建新專案 ) 頁面上,在 Search (搜索) 框中輸入 blank app ,然後選擇 C# Blank App (Universal Windows) (C# Blank App (Universal Windows) (C# Blank App (Universal Windows)) )專案範本。
- 在 Configure your new project (配置新專案 ) 頁面上,將專案命名為 Maths,然後選擇 Create (創建)。
- (可選)更改目標和最低平臺版本,然後選擇 確定。 Visual Studio 將創建專案並在 解決方案資源管理器中打開它。
建立單元測試專案:
- 在 「解決方案資源管理器」中,右鍵按兩下 Maths 解決方案,然後選擇「 添加新>專案」。
- 在 Add a new project 頁上,在 Search 框中輸入 unit test ,然後選擇 C# Unit Test App (Universal Windows) 專案範本。
- 將測試專案命名為 RooterTests,然後選擇 Create (創建)。
- (可選)更改目標和最低平臺版本,然後選擇 確定。 RooterTests 項目顯示在「解決方案資源管理器」中的 Maths 解決方案下。
驗證測試是否在測試資源管理器中運行
該 Assert 類提供了多種靜態方法,您可以使用這些方法驗證測試方法中的結果。
在「解決方案資源管理器」中,選擇 RooterTests 專案中的 UnitTest.cs 檔。
將以下代碼插入
TestMethod1
:[TestMethod] public void TestMethod1() { Assert.AreEqual(0, 0); }
在 Test Explorer 中,選擇 Run All Tests。
測試專案將生成並運行,並且測試將顯示在 Passed Tests下。 右側的 Group Summary (組摘要 ) 窗格提供有關測試的詳細資訊。
向 app 專案添加類
在 「解決方案資源管理器」中,右鍵按兩下 Maths 專案,然後選擇「 添加>類」。。
將類檔命名為 Rooter.cs,然後選擇 Add ( 添加)。
在代碼編輯器中,將以下代碼添加到 Rooter.cs 檔中的
Rooter
類中:public Rooter() { } // estimate the square root of a number public double SquareRoot(double x) { return 0.0; }
該
Rooter
類聲明一個構造函數和SquareRoot
estimator 方法。 該方法SquareRoot
是測試基本測試設置的最小實現。將
internal
keywordtopublic
更改為類聲明中的Rooter
關鍵字,以便測試代碼可以訪問它。public class Rooter
在 「解決方案資源管理器」中,右鍵按兩下 Maths 專案,然後選擇「 添加>類」。。
將類檔命名為 Rooter.cs,然後選擇 Add ( 添加)。
在代碼編輯器中,將以下代碼添加到 Rooter.cs 檔中的
Rooter
類中:public Rooter() { } // estimate the square root of a number public double SquareRoot(double x) { return 0.0; }
該
Rooter
類聲明一個構造函數和SquareRoot
estimator 方法。 該方法SquareRoot
是測試基本測試設置的最小實現。public
將關鍵字添加到類聲明中Rooter
,以便測試代碼可以訪問它。public class Rooter
將 test 專案中的引用添加到 app 專案
在 「解決方案資源管理器」中,右鍵按下 RooterTests 專案,然後選擇「 添加>引用」。
在 Reference Manager - RooterTests 對話框中,展開 Projects 專案,然後選擇 Maths 專案。
請選擇 [確定]。
將以下
using
語句添加到 UnitTest.cs的行后using Microsoft.VisualStudio.TestTools.UnitTesting;
:using Maths;
在 「解決方案資源管理器」中,右鍵按下 RooterTests 專案,然後選擇「 添加>引用」。
在 Reference Manager - RooterTests 對話框中,展開 Projects 專案,然後選擇 Maths 專案。
請選擇 [確定]。
將以下
using
語句新增到 UnitTest.cs 行後using Microsoft.VisualStudio.TestTools.UnitTesting;
:using Maths;
添加使用 app 函數的測試
將以下測試方法新增到 UnitTest.cs:
[TestMethod] public void BasicTest() { Maths.Rooter rooter = new Rooter(); double expected = 0.0; double actual = rooter.SquareRoot(expected * expected); double tolerance = .001; Assert.AreEqual(expected, actual, tolerance); }
新測試將顯示在「解決方案資源管理器」 和「測試資源管理器」 的「 未運行的測試」節點中。
若要避免“Payload contains two or more files with the same destination path”錯誤,請在 Solution Explorer 中,展開 Maths 專案下的 Properties 節點,然後刪除 Default.rd.xml 檔。
儲存所有檔案。
執行測試
在 Test Explorer 中,選擇 Run All Tests 圖示。 解決方案生成,測試運行並通過。
在 Test Explorer 中,選擇 Run All Tests 圖示。 解決方案生成,測試運行並通過。
如果在運行測試時收到 Duplicate Entity 錯誤,請從測試專案中刪除運行時指令檔, Properties\Default.rd.xml
然後重試。
您已經設置了test和 app 專案,並驗證了是否可以運行調用 app 專案中的函數的測試。 現在,您可以編寫真實的測試和代碼。
添加測試並使其通過
最好不要更改已通過的測試。 請改為添加新測試。 通過一次添加一個測試來開發代碼,並確保每次反覆運算后所有測試都通過。
新增名為
RangeTest
UnitTest.cs 的新測試:[TestMethod] public void RangeTest() { Rooter rooter = new Rooter(); for (double v = 1e-6; v < 1e6; v = v * 3.2) { double expected = v; double actual = rooter.SquareRoot(v*v); double tolerance = expected/1000; Assert.AreEqual(expected, actual, tolerance); } }
運行 RangeTest 測試並驗證它是否失敗。
小提示
在測試驅動開發中,您可以在編寫測試后立即運行測試。 這種做法可以説明您避免編寫永不失敗的測試的簡單錯誤。
修復您的應用代碼,以便新測試通過。 在 Rooter.cs 中,更改
SquareRoot
函數,如下所示:public double SquareRoot(double x) { double estimate = x; double diff = x; while (diff > estimate / 1000) { double previousEstimate = estimate; estimate = estimate - (estimate * estimate - x) / (2 * estimate); diff = Math.Abs(previousEstimate - estimate); } return estimate; }
在 Test Explorer 中,選擇 Run all tests 圖示。 現在所有三項測試都通過了。
新增名為
RangeTest
UnitTest.cs 的新測試:[TestMethod] public void RangeTest() { Rooter rooter = new Rooter(); for (double v = 1e-6; v < 1e6; v = v * 3.2) { double expected = v; double actual = rooter.SquareRoot(v*v); double tolerance = expected/1000; Assert.AreEqual(expected, actual, tolerance); } }
運行 RangeTest 測試並驗證它是否失敗。
小提示
在測試驅動開發中,您可以在編寫測試后立即運行測試。 這種做法可以説明您避免編寫永不失敗的測試的簡單錯誤。
修復您的應用代碼,以便新測試通過。 在 Rooter.cs 中,更改
SquareRoot
函數,如下所示:public double SquareRoot(double x) { double estimate = x; double diff = x; while (diff > estimate / 1000) { double previousEstimate = estimate; estimate = estimate - (estimate * estimate - x) / (2 * estimate); diff = Math.Abs(previousEstimate - estimate); } return estimate; }
在 Test Explorer 中,選擇 Run all tests 圖示。 現在所有三項測試都通過了。
重構程序代碼
在本部分中,您將重構應用和測試代碼,然後重新運行測試以確保它們仍然通過。
簡化平方根估計
在 Rooter.cs 中,通過更改以下行來簡化函數中的
SquareRoot
中心計算:estimate = estimate - (estimate * estimate - x) / (2 * estimate);
發往
estimate = (estimate + x/estimate) / 2.0;
運行所有測試以確保您沒有引入回歸。 測試應該都通過。
刪除重複的測試代碼
該方法RangeTest
對傳遞給Assert該方法的tolerance
變數的分母進行硬編碼。 如果您計劃添加更多使用相同容差計算的測試,則在多個位置使用硬編碼值會使代碼更難維護。 相反,您可以向UnitTest1
類中添加私有幫助程式方法來計算容差值,然後從 .RangeTest
要添加説明程式方法,請在 UnitTest.cs 中:
將下列方法新增至
CategoriesBLL
班級:private double ToleranceHelper(double expected) { return expected / 1000; }
在
RangeTest
中,更改以下行:double tolerance = expected/1000;
發往
double tolerance = ToleranceHelper(expected);
運行 RangeTest 測試以確保它仍然通過。
小提示
如果向測試類添加説明程式方法,並且不希望説明程式方法顯示在 測試資源管理器的清單中,請不要將該屬性添加到 TestMethodAttribute 該方法中。