在本主题中,我们提供了有关如何使用 <
教程:创建 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 单元测试应用项目
首先,创建一个单元测试项目。 项目类型附带所需的所有模板文件。
打开Visual Studio,然后在“开始”窗口中选择创建一个新项目。
在 创建新项目窗口中,将项目筛选为 C#, Windows 和 WinUI,选择 WinUI 单元测试应用模板,然后选择 Next
[可选] 在配置新项目窗口中,更改项目名称、解决方案名称(取消选中将解决方案和项目放在同一目录中)和项目的位置。
选择 创建。
使用测试资源管理器运行测试
创建测试项目时,测试将显示在测试资源管理器中,用于运行单元测试。 还可以将测试分组为类别、筛选测试列表、创建、保存和运行测试播放列表、调试单元测试和(在 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);
}
}
}
如果尚未这样做,请生成解决方案。 这将允许Visual Studio“发现”所有可用测试。
打开“测试资源管理器”。 如果不可见,请打开测试菜单,然后选择测试资源管理器(或按 Ctrl + E、T)。
查看测试。 在测试资源管理器窗口中,展开所有节点(此时将只显示示例测试)。
运行测试。
- 右键单击单个测试节点,然后选择运行。
- 选择测试,然后按播放按钮或按 Ctrl + R、T。
- 按在视图中运行所有测试按钮或按 Ctrl + R、V。
查看结果。 测试完成后,结果将显示在测试资源管理器窗口中。
添加用于测试的类库项目
向单元测试解决方案添加新项目。 在 Solution Explorer 中,右键单击解决方案并选择 Add -> 新建项目...。
Visual Studio 中解决方案上下文菜单的屏幕截图,其中突出显示了“添加/新建项目”。
对于此示例,请添加 WinUI 3 类库项目。 在“新建项目”窗口中,筛选 C#/Windows/WinUI,然后选择 WinUI 类库。
选择 “下一步 ”并输入项目的名称(在本示例中使用
WinUIClassLibrary1),然后按 Create。
在项目中添加新的
UserControl。 在 Solution Explorer 中,右键单击刚添加的 WinUI 3 类库项目,然后从上下文菜单中选择 Add -> New Item。
在“添加新项”窗口中,选择“已安装项”列表中的 WinUI 节点,然后从结果中选择“用户控制”。 将控件
UserControl1命名为 。在 Visual Studio 的“添加新项”窗口中,突出显示了 WinUI/用户控件(WinUI)的截图。
打开 UserControl1.xaml.cs 代码隐藏文件。 对于此示例,我们添加了一个新的公共方法,该方法
GetSeven只返回一个整数。namespace WinUICLassLibrary1 { public sealed partial class UserControll : UserControl { public UserControl1() { this.InitializeComponent(); } public int GetSeven() { return 7; } } }将 WinUI 3 类库项目设置为单元测试项目的依赖项,以允许使用 WinUI 3 类库项目中的类型。 在 Solution Explorer 类库项目中,右键单击 Dependencies 并选择 Add Project Reference。
在 Visual Studio 中依赖项上下文菜单的屏幕截图,其中“添加项目引用”被突出显示。 WinUIClassLibrary1从“项目”列表中选择该项。
在 UnitTests.cs 中创建新的测试方法。 由于此测试用例需要 XAML UI 线程才能运行,请使用
[UITestMethod]属性而不是标准[TestMethod]属性对其进行标记。[UITestMethod] public void TestUserControl1() { WinUIClassLibrary1.UserControl1 userControl1 = new WinUIClassLibrary1.UserControl1(); Assert.AreEqual(7, userControl1.GetSeven()); }此新测试方法现在作为单元测试之一显示在测试资源管理器中。
运行测试。
- 右键单击新测试节点,然后选择运行。
- 选择新测试,然后按播放按钮或按 Ctrl + R、T。
- 按在视图中运行所有测试按钮或按 Ctrl + R、V。
测试非 WinUI 功能
在许多情况下,应用包含的功能不依赖于 Microsoft.UI.Xaml 类型,但仍需要测试。 各种工具可用于测试.NET代码,包括 MSTest、NUnit 和 xUnit。 有关测试.NET应用的更多详细信息,请参阅
在Visual Studio中,可以通过右键单击Solution Explorer中的解决方案,为这些测试工具中的任何一个创建新项目。 从上下文菜单中选择Add -> New Project,从所有语言选择器中选择C#,从Windows选择器中选择Windows,从所有项目类型选择器中选择测试,然后从列表中选择适当的测试工具(MSTest 测试项目、NUnit 测试项目或xUnit 测试项目)。
创建新的引用 WinUI 3 项目的 MSTest、NUnit 或 xUnit 项目时,必须:
在测试项目的 .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>。更新测试项目中的运行时标识符。
<RuntimeIdentifiers Condition="$([MSBuild]::GetTargetFrameworkVersion('$(TargetFramework)')) >= 8">win-x86;win-x64;win-arm64</RuntimeIdentifiers><RuntimeIdentifiers Condition="$([MSBuild]::GetTargetFrameworkVersion('$(TargetFramework)')) < 8">win10-x86;win10-x64;win10-arm64</RuntimeIdentifiers>将以下属性添加到测试项目的 .csproj 文件中的
PropertyGroup,以确保测试加载Windows App SDK运行时:<WindowsAppSdkBootstrapInitialize>true</WindowsAppSdkBootstrapInitialize>确保在运行测试的计算机上安装Windows App SDK运行时。 有关 Windows App SDK 部署的详细信息,请参阅用于在外部位置(或未打包)情况下打包依赖框架应用程序的 Windows App SDK 部署指南。