通过


测试使用Windows App SDK生成的 WinUI 应用

在本主题中,我们提供了有关如何使用 < Windows App SDK 使用 WinUI 3 用户界面(UI)功能创建的应用中测试和验证功能的建议。 测试是应用开发过程的重要组成部分-它有助于尽早捕获 bug、维护代码质量,并确保随着应用的发展而获得可靠的用户体验。 通过将单元测试合并到工作流中,可以自信地重构代码、添加新功能和交付更新,知道现有功能继续按预期工作。

教程:创建 WinUI 3 单元测试项目。

Microsoft.UI.Xaml 命名空间下的大多数对象类型都必须从 XAML 应用程序进程中的 UI 线程使用。 (有关使用 Windows App SDK 创建但不使用 WinUI 3 的测试应用的详细信息,请参阅以下部分,测试非 WinUI 功能。)

注释

建议重构要测试的任何代码,方法是将其从主应用项目中提取出来,并放入库项目中。 然后,应用项目和单元测试项目都可以引用该库项目。 本部分介绍如何使用内置单元测试项目模板在 Visual Studio 中创建 WinUI 3 应用的单元测试。

注释

此处所述的单元测试应用是在 WinUI 3 应用程序的上下文中编写的。 对于执行需要 XAML 运行时的代码的任何测试,这是必需的。 此项目将创建一个 XAML UI 线程并执行测试。

本教程中,您将学习如何:

  • 在 Visual Studio 中创建 WinUI 单元测试应用项目。
  • 使用 Visual Studio Test Explorer
  • 添加用于测试的 WinUI 类库 项目。
  • 使用Visual Studio测试资源管理器运行测试。

先决条件

必须为 WinUI 开发安装和设置Visual Studio。 请参阅 快速入门:设置环境并创建 WinUI 3 项目

创建 WinUI 单元测试应用项目

首先,创建一个单元测试项目。 项目类型附带所需的所有模板文件。

  1. 打开Visual Studio,然后在“开始”窗口中选择创建一个新项目

     Visual Studio 开始窗口的Screenshot.

  2. 创建新项目窗口中,将项目筛选为 C#WindowsWinUI,选择 WinUI 单元测试应用模板,然后选择 Next

    Visual Studio“创建新项目”窗口的Screenshot.

  3. [可选] 在配置新项目窗口中,更改项目名称解决方案名称(取消选中将解决方案和项目放在同一目录中)和项目的位置

  4. 选择 创建

使用测试资源管理器运行测试

创建测试项目时,测试将显示在测试资源管理器中,用于运行单元测试。 还可以将测试分组为类别、筛选测试列表、创建、保存和运行测试播放列表、调试单元测试和(在 Visual Studio Enterprise 中)分析代码覆盖率。

UnitTests.cs 文件包含测试资源管理器使用的单元测试的源代码。 默认情况下,此处显示的基本示例测试会自动创建:

namespace WinUITest1
{
   [TestClass]
   public class UnitTest1
   {
      [TestMethod]
      public void TestMethod1()
      {
         Assert.AreEqual(0, 0);
      }

      // Use the UITestMethod attribute for tests that need to run on the UI thread.
      [UITestMethod]
      public void TestMethod2()
      {
         var grid = new Grid();
         Assert.AreEqual(0, grid.MinWidth);
      }
   }
}
  1. 如果尚未这样做,请生成解决方案。 这将允许Visual Studio“发现”所有可用测试。

  2. 打开“测试资源管理器”。 如果不可见,请打开测试菜单,然后选择测试资源管理器(或按 Ctrl + E、T)。

    Visual Studio 中测试菜单的截图。

  3. 查看测试。 在测试资源管理器窗口中,展开所有节点(此时将只显示示例测试)。

    Visual Studio 中测试资源管理器窗口的截图,其中显示了默认的示例测试。

  4. 运行测试。

    • 右键单击单个测试节点,然后选择运行
    • 选择测试,然后按播放按钮或按 Ctrl + R、T
    • 在视图中运行所有测试按钮或按 Ctrl + R、V

    Visual Studio 的“测试资源管理器”窗口截图,其中显示了测试上下文菜单,并突出显示了“运行”命令。

  5. 查看结果。 测试完成后,结果将显示在测试资源管理器窗口中。

    Visual Studio 测试资源管理器窗口的屏幕截图,显示测试运行结果。

添加用于测试的类库项目

  1. 向单元测试解决方案添加新项目。 在 Solution Explorer 中,右键单击解决方案并选择 Add -> 新建项目...

    Visual Studio 中解决方案上下文菜单的屏幕截图,其中突出显示了“添加/新建项目”。

  2. 对于此示例,请添加 WinUI 3 类库项目。 在“新建项目”窗口中,筛选 C#/Windows/WinUI,然后选择 WinUI 类库

    在 Visual Studio 的新项目窗口中的屏幕截图,其中 WinUI 类库被突出显示。

  3. 选择 “下一步 ”并输入项目的名称(在本示例中使用 WinUIClassLibrary1),然后按 Create

    在解决方案资源管理器中,高亮显示了新的“WinUI 类库”项目,并在代码编辑器中打开了 Class1.cs 文件的屏幕截图。

  4. 在项目中添加新的UserControl。 在 Solution Explorer 中,右键单击刚添加的 WinUI 3 类库项目,然后从上下文菜单中选择 Add -> New Item

    Visual Studio 解决方案上下文菜单的截图,其中突出显示了添加/新建项目。

  5. 在“添加新项”窗口中,选择“已安装项”列表中的 WinUI 节点,然后从结果中选择“用户控制”。 将控件 UserControl1命名为 。

    在 Visual Studio 的“添加新项”窗口中,突出显示了 WinUI/用户控件(WinUI)的截图。

  6. 打开 UserControl1.xaml.cs 代码隐藏文件。 对于此示例,我们添加了一个新的公共方法,该方法 GetSeven 只返回一个整数。

    namespace WinUICLassLibrary1
    {
      public sealed partial class UserControll : UserControl
      {
         public UserControl1()
         {
             this.InitializeComponent();
         }
    
         public int GetSeven()
         {
             return 7;
         }
      }
    }
    
  7. 将 WinUI 3 类库项目设置为单元测试项目的依赖项,以允许使用 WinUI 3 类库项目中的类型。 在 Solution Explorer 类库项目中,右键单击 Dependencies 并选择 Add Project Reference

    在 Visual Studio 中依赖项上下文菜单的屏幕截图,其中“添加项目引用”被突出显示。

    WinUIClassLibrary1“项目”列表中选择该项。

    “引用管理器”对话框的屏幕截图,其中选择了“WinUIClassLibrary1”项目。

  8. 在 UnitTests.cs 中创建新的测试方法。 由于此测试用例需要 XAML UI 线程才能运行,请使用 [UITestMethod] 属性而不是标准 [TestMethod] 属性对其进行标记。

    [UITestMethod]
    public void TestUserControl1()
    {
       WinUIClassLibrary1.UserControl1 userControl1 = new WinUIClassLibrary1.UserControl1();
       Assert.AreEqual(7, userControl1.GetSeven());
    }
    

    此新测试方法现在作为单元测试之一显示在测试资源管理器中。

    在 Visual Studio 中的测试资源管理器窗口的屏幕截图,显示了带有新的单元测试的默认示例测试。

  9. 运行测试。

  • 右键单击新测试节点,然后选择运行
  • 选择新测试,然后按播放按钮或按 Ctrl + R、T
  • 在视图中运行所有测试按钮或按 Ctrl + R、V

Visual Studio中测试资源管理器窗口的截屏,显示完整的默认示例测试和新的单元测试的测试运行。

测试非 WinUI 功能

在许多情况下,应用包含的功能不依赖于 Microsoft.UI.Xaml 类型,但仍需要测试。 各种工具可用于测试.NET代码,包括 MSTestNUnitxUnit。 有关测试.NET应用的更多详细信息,请参阅 .NET

在Visual Studio中,可以通过右键单击Solution Explorer中的解决方案,为这些测试工具中的任何一个创建新项目。 从上下文菜单中选择Add -> New Project,从所有语言选择器中选择C#,从Windows选择器中选择Windows,从所有项目类型选择器中选择测试,然后从列表中选择适当的测试工具(MSTest 测试项目NUnit 测试项目xUnit 测试项目)。

创建新的引用 WinUI 3 项目的 MSTest、NUnit 或 xUnit 项目时,必须:

  1. 在测试项目的 .csproj 文件中更新 TargetFramework。 此值必须与 WinUI 3 项目中的 TargetFramework 匹配。 默认情况下,MSTest、NUnit 和 xUnit 项目面向.NET支持的全部平台,但 WinUI 3 项目仅支持Windows,并且具有更具体的 TargetFramework。

    例如,如果面向 .NET 8,请将单元测试项目的 TargetFramework 从 <TargetFramework>net8.0</TargetFramework> 更新为 <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>

  2. 更新测试项目中的运行时标识符。

    <RuntimeIdentifiers Condition="$([MSBuild]::GetTargetFrameworkVersion('$(TargetFramework)')) &gt;= 8">win-x86;win-x64;win-arm64</RuntimeIdentifiers>

    <RuntimeIdentifiers Condition="$([MSBuild]::GetTargetFrameworkVersion('$(TargetFramework)')) &lt; 8">win10-x86;win10-x64;win10-arm64</RuntimeIdentifiers>

  3. 将以下属性添加到测试项目的 .csproj 文件中的 PropertyGroup,以确保测试加载Windows App SDK运行时:<WindowsAppSdkBootstrapInitialize>true</WindowsAppSdkBootstrapInitialize>

  4. 确保在运行测试的计算机上安装Windows App SDK运行时。 有关 Windows App SDK 部署的详细信息,请参阅用于在外部位置(或未打包)情况下打包依赖框架应用程序的 Windows App SDK 部署指南

其他资源