共用方式為


演練:為UWP應用創建和運行單元測試

本文介紹如何在Visual Studio中對通用 Windows 平臺 (UWP) 應用程式進行單元測試。 Visual Studio 提供適用於 C#、Visual Basic 和 C++ 的 UWP 單元測試專案範本。 有關開發 UWP 應用的詳細資訊,請參閱 UWP 應用入門

本文介紹了在UWP應用程式中創建 C# 類並對其進行單元測試的範例。 該示例使用 測試驅動開發 來編寫驗證特定行為的測試,然後編寫通過測試的代碼。

創建並運行單元測試專案

以下過程介紹如何為UWP應用創建和運行單元測試專案。

創建UWP單元測試專案

  1. 在 Visual Studio Start(Visual Studio 開始 )視窗中,選擇 Create a new project(創建新專案)。

  2. Create a new project (創建新項目 ) 頁面上,在 Search (搜尋) 框中輸入 unit test 。 範本清單篩選到單元測試專案。

  3. 為 C# 或 Visual Basic 選擇正確的 UWP 單元測試範本,然後選擇 “下一步”。

    從 Visual Studio 2022 版本 17.14 開始,C# 和 .NET 9 的推薦單元測試範本是 UWP 單元測試應用 ,面向本機 AOT。 較舊的 UWP 範本名為 UWP 單元測試應用程式 (.NET Native)單元測試應用程式 (Universal Windows)。

    顯示如何在 Visual Studio 中創建新的 UWP 單元測試應用的螢幕截圖。

  4. (可選)更改專案或解決方案的名稱和位置,然後選擇 Create ( 創建)。

  5. (可選)更改目標和最低平臺版本,然後選擇 確定

Visual Studio 將創建測試專案,並在 Visual Studio 解決方案資源管理器中打開它。

顯示解決方案資源管理器中UWP單元測試專案的螢幕截圖。

  1. 在 Visual Studio Start(Visual Studio 開始 )視窗中,選擇 Create a new project(創建新專案)。

  2. Create a new project (創建新項目 ) 頁面上,在 Search (搜尋) 框中輸入 unit test 。 範本清單篩選到單元測試專案。

  3. 選擇適用於 C# 或 Visual Basic 的 Unit Test App (Universal Windows) 範本,然後選擇 Next

    顯示如何在 Visual Studio 中創建新的 UWP 單元測試應用的螢幕截圖。

  4. (可選)更改專案或解決方案的名稱和位置,然後選擇 Create ( 創建)。

  5. (可選)更改目標和最低平臺版本,然後選擇 確定

Visual Studio 將創建測試專案,並在 Visual Studio 解決方案資源管理器中打開它。

顯示解決方案資源管理器中UWP單元測試專案的螢幕截圖。

編輯專案的應用程式清單

  1. 「解決方案資源管理器」中,右鍵按兩下 Package.appxmanifest 檔,然後選擇「 打開」。

  2. 在清單設計器中,選擇 Capabilities (功能 ) 選項卡。

  3. Capabilities (功能 ) 清單中,選擇代碼和單元測試所需的功能。 例如,如果您的代碼及其單元測試需要訪問 Internet,請選中 Internet 複選框。

僅選擇單元測試正常運行所需的功能。

顯示單元測試清單的屏幕截圖。

顯示單元測試清單的屏幕截圖。

添加代碼以對 UWP 應用進行單元測試

在 Visual Studio 程式碼編輯器中,編輯單元測試代碼檔以添加測試所需的斷言和邏輯。 有關範例,請參閱本文後面 的 C# 類的單元測試

使用 Test Explorer 運行單元測試

使用 Test Explorer 構建解決方案並運行單元測試。

  1. 在 Visual Studio 的「測試 」功能表上,選擇 「測試資源管理器」。。 [測試總管] 視窗隨即開啟。

  2. Test Explorer 中,選擇 Run all 圖示。 您必須使用 Run all 來發現 UWP 專案中的測試。

    顯示 Test Explorer Run all 圖示的螢幕截圖。

解決方案生成並運行單元測試。 測試運行后,測試將顯示在 Test Explorer 測試清單中,其中包含有關結果和持續時間的資訊。

顯示包含已完成測試資訊的 Test Explorer 的螢幕截圖。

此外,在 測試資源管理器中,您可以選擇單個測試並右鍵按兩下以 運行除錯 測試 ,或右鍵按兩下 以打開測試代碼。 在頂部選單中,您可以對測試進行分組、將測試添加到播放清單或打開測試選項。

顯示 Test Explorer 上下文功能表的螢幕截圖。

使用 Test Explorer 構建解決方案並運行單元測試。

  1. 在 Visual Studio 的「測試 」功能表上,選擇 「測試資源管理器」。。 [測試總管] 視窗隨即開啟。

  2. Test Explorer 中,選擇 Run all 圖示。 您必須使用 Run all 來發現 UWP 專案中的測試。

    顯示 Test Explorer Run all 圖示的螢幕截圖。

解決方案生成並運行單元測試。 測試運行后,測試將顯示在 Test Explorer 測試清單中,其中包含有關結果和持續時間的資訊。

顯示包含已完成測試資訊的 Test Explorer 的螢幕截圖。

此外,在 測試資源管理器中,您可以選擇單個測試並右鍵按兩下以 運行除錯 測試 ,或右鍵按兩下 以打開測試代碼。 在頂部選單中,您可以對測試進行分組、將測試添加到播放清單或打開測試 選項

顯示 Test Explorer 上下文功能表的螢幕截圖。

對 C# 類進行單元測試

一組穩定的良好單元測試可以增強您在更改代碼時沒有引入bug的信心。 以下示例介紹了在UWP應用中為 C# 類創建單元測試的一種方法。 該示例使用 測試驅動開發 來編寫驗證特定行為的測試,然後編寫通過測試的代碼。

在示例 Maths 代碼專案中, Rooter 類實現一個計算數位的估計平方根的函數。 RooterTests 專案單元測試 Rooter 類。

創建解決方案和專案

建立 UWP 應用專案:

  1. 在 Visual Studio 的「檔 」功能表上,選擇 「新建專案」。
  2. Create a new project (創建新專案 ) 頁面上,在 Search (搜索) 框中輸入 blank app ,然後選擇 C# Blank App (Universal Windows) (C# Blank App (Universal Windows) (C# Blank App (Universal Windows)) )專案範本。
  3. Configure your new project (配置新專案 ) 頁面上,將專案命名為 Maths,然後選擇 Create (創建)。
  4. (可選)更改目標和最低平臺版本,然後選擇 確定。 Visual Studio 將創建專案並在 解決方案資源管理器中打開它。

建立單元測試專案:

  1. 「解決方案資源管理器」中,右鍵按兩下 Maths 解決方案,然後選擇「 添加新>專案」。
  2. Add a new project 頁上,在 Search 框中輸入 unit test ,然後選擇 C# Unit Test App (Universal Windows) 專案範本。
  3. 將測試專案命名為 RooterTests,然後選擇 Create (創建)。
  4. (可選)更改目標和最低平臺版本,然後選擇 確定RooterTests 項目顯示在「解決方案資源管理器」中的 Maths 解決方案下。

驗證測試是否在測試資源管理器中運行

Assert 類提供了多種靜態方法,您可以使用這些方法驗證測試方法中的結果。

  1. 「解決方案資源管理器」中,選擇 RooterTests 專案中的 UnitTest.cs 檔。

  2. 將以下代碼插入 TestMethod1

    [TestMethod]
    public void TestMethod1()
    {
        Assert.AreEqual(0, 0);
    }
    
  3. Test Explorer 中,選擇 Run All Tests。

  4. 測試專案將生成並運行,並且測試將顯示在 Passed Tests下。 右側的 Group Summary (組摘要 ) 窗格提供有關測試的詳細資訊。

向 app 專案添加類

  1. 「解決方案資源管理器」中,右鍵按兩下 Maths 專案,然後選擇「 添加>」。。

  2. 將類檔命名為 Rooter.cs,然後選擇 Add ( 添加)。

  3. 在代碼編輯器中,將以下代碼添加到 Rooter.cs 檔中的Rooter類中:

    public Rooter()
    {
    }
    
    // estimate the square root of a number
    public double SquareRoot(double x)
    {
        return 0.0;
    }
    

    Rooter 類聲明一個構造函數和 SquareRoot estimator 方法。 該方法 SquareRoot 是測試基本測試設置的最小實現。

  4. internal keywordto public 更改為類聲明中的 Rooter 關鍵字,以便測試代碼可以訪問它。

    public class Rooter
    
  1. 「解決方案資源管理器」中,右鍵按兩下 Maths 專案,然後選擇「 添加>」。。

  2. 將類檔命名為 Rooter.cs,然後選擇 Add ( 添加)。

  3. 在代碼編輯器中,將以下代碼添加到 Rooter.cs 檔中的Rooter類中:

    public Rooter()
    {
    }
    
    // estimate the square root of a number
    public double SquareRoot(double x)
    {
        return 0.0;
    }
    

    Rooter 類聲明一個構造函數和 SquareRoot estimator 方法。 該方法 SquareRoot 是測試基本測試設置的最小實現。

  4. public將關鍵字添加到類聲明中Rooter,以便測試代碼可以訪問它。

    public class Rooter
    

將 test 專案中的引用添加到 app 專案

  1. 「解決方案資源管理器」中,右鍵按下 RooterTests 專案,然後選擇「 添加>引用」。

  2. Reference Manager - RooterTests 對話框中,展開 Projects 專案,然後選擇 Maths 專案。

    顯示添加對Maths專案的引用的螢幕截圖。

  3. 請選擇 [確定]

  4. 將以下 using 語句添加到 UnitTest.cs的行后 using Microsoft.VisualStudio.TestTools.UnitTesting;

    using Maths;
    
  1. 「解決方案資源管理器」中,右鍵按下 RooterTests 專案,然後選擇「 添加>引用」。

  2. Reference Manager - RooterTests 對話框中,展開 Projects 專案,然後選擇 Maths 專案。

    顯示添加對Maths專案的引用的螢幕截圖。

  3. 請選擇 [確定]

  4. 將以下 using 語句新增到 UnitTest.cs 行後 using Microsoft.VisualStudio.TestTools.UnitTesting;

    using Maths;
    

添加使用 app 函數的測試

  1. 將以下測試方法新增到 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);
    }
    

    新測試將顯示在「解決方案資源管理器」 和「測試資源管理器」 的「 未運行的測試」節點中。

  2. 若要避免“Payload contains two or more files with the same destination path”錯誤,請在 Solution Explorer 中,展開 Maths 專案下的 Properties 節點,然後刪除 Default.rd.xml 檔。

  3. 儲存所有檔案。

執行測試

Test Explorer 中,選擇 Run All Tests 圖示。 解決方案生成,測試運行並通過。

顯示在測試資源管理器中傳遞的基本測試的屏幕截圖

Test Explorer 中,選擇 Run All Tests 圖示。 解決方案生成,測試運行並通過。

顯示在測試資源管理器中傳遞的基本測試的屏幕截圖

如果在運行測試時收到 Duplicate Entity 錯誤,請從測試專案中刪除運行時指令檔, Properties\Default.rd.xml 然後重試。

您已經設置了test和 app 專案,並驗證了是否可以運行調用 app 專案中的函數的測試。 現在,您可以編寫真實的測試和代碼。

添加測試並使其通過

最好不要更改已通過的測試。 請改為添加新測試。 通過一次添加一個測試來開發代碼,並確保每次反覆運算后所有測試都通過。

  1. 新增名為 RangeTestUnitTest.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);
        }
    }
    
  2. 運行 RangeTest 測試並驗證它是否失敗。

    顯示 RangeTest 在測試資源管理器中失敗的螢幕截圖。

    小提示

    在測試驅動開發中,您可以在編寫測試后立即運行測試。 這種做法可以説明您避免編寫永不失敗的測試的簡單錯誤。

  3. 修復您的應用代碼,以便新測試通過。 在 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;
    }
    
  4. Test Explorer 中,選擇 Run all tests 圖示。 現在所有三項測試都通過了。

  1. 新增名為 RangeTestUnitTest.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);
        }
    }
    
  2. 運行 RangeTest 測試並驗證它是否失敗。

    顯示 RangeTest 在測試資源管理器中失敗的螢幕截圖。

    小提示

    在測試驅動開發中,您可以在編寫測試后立即運行測試。 這種做法可以説明您避免編寫永不失敗的測試的簡單錯誤。

  3. 修復您的應用代碼,以便新測試通過。 在 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;
    }
    
  4. Test Explorer 中,選擇 Run all tests 圖示。 現在所有三項測試都通過了。

重構程序代碼

在本部分中,您將重構應用和測試代碼,然後重新運行測試以確保它們仍然通過。

簡化平方根估計

  1. 在 Rooter.cs 中,通過更改以下行來簡化函數中的SquareRoot中心計算:

    estimate = estimate - (estimate * estimate - x) / (2 * estimate);

    發往

    estimate = (estimate + x/estimate) / 2.0;

  2. 運行所有測試以確保您沒有引入回歸。 測試應該都通過。

刪除重複的測試代碼

該方法RangeTest對傳遞給Assert該方法的tolerance變數的分母進行硬編碼。 如果您計劃添加更多使用相同容差計算的測試,則在多個位置使用硬編碼值會使代碼更難維護。 相反,您可以向UnitTest1類中添加私有幫助程式方法來計算容差值,然後從 .RangeTest

要添加説明程式方法,請在 UnitTest.cs 中:

  1. 將下列方法新增至 CategoriesBLL班級:

    private double ToleranceHelper(double expected)
    {
        return expected / 1000;
    }
    
  2. RangeTest中,更改以下行:

    double tolerance = expected/1000;

    發往

    double tolerance = ToleranceHelper(expected);

  3. 運行 RangeTest 測試以確保它仍然通過。

小提示

如果向測試類添加説明程式方法,並且不希望説明程式方法顯示在 測試資源管理器的清單中,請不要將該屬性添加到 TestMethodAttribute 該方法中。

後續步驟