跳到主要内容

6.4 调试、测试与发布

学习目标​

你将建立从绑定诊断、ViewModel 测试到发布验收的检查顺序。前提:Windows 已安装 .NET 10 SDK,能够运行 WPF 工程;只有运行时不能执行构建和测试命令。配套项目路径见 实战项目结构。

调试:先确认状态,再检查呈现​

后端错误常出现在请求日志中;WPF 绑定失败常只写入调试输出。文本空白时,先检查 DataContext 类型、属性名、访问权限和属性值,再检查通知与模板。命令不执行时,检查绑定目标、CanExecute 和状态通知。

Visual Studio 的“输出”窗口查看绑定错误,“实时可视化树”和“实时属性资源管理器”检查元素与属性来源,帮助定位本地值覆盖样式、模板改变结构等问题。

给已有窗口根元素添加下列命名空间,再把诊断附加到有问题的绑定。前提:ViewModel 确实提供 Title 属性;这是调试片段,定位后可降低跟踪等级以减少输出。

MainWindow.xaml:根元素命名空间属性
xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
MainWindow.xaml:控件片段
<TextBox Text="{Binding Title,
UpdateSourceTrigger=PropertyChanged,
diag:PresentationTraceSources.TraceLevel=High}" />

按操作边界记录异常并给用户提示;全局未处理异常事件可作最后的日志入口,但不能保证异常后状态仍正确。网络日志记录状态码、耗时和关联标识,不记录令牌或敏感正文。

测试:优先验证界面背后的规则​

ViewModel 可脱离窗口测试输入、命令、错误与取消。用假 API 和确认服务控制结果,减少外部依赖。涉及真实 Dispatcher 与控件的测试需要 STA 和 UI 测试环境,普通测试线程不能充当界面线程。

下面是独立示范的完整规则文件;可供 ViewModel 的 CanExecute 调用,但服务端仍要独立校验。文件放在客户端项目根目录,命名空间为 TaskDesk.Client。

TitleRules.cs
namespace TaskDesk.Client;

public static class TitleRules
{
public static bool IsValid(string? title)
{
var length = title?.Trim().Length ?? 0;
return length is >= 1 and <= 120;
}
}

在 examples/TaskDesk 创建测试项目,需要 SDK 和 NuGet。创建后,把 TargetFramework 改为 net10.0-windows,并在同一 PropertyGroup 设置 <UseWPF>true</UseWPF>,然后添加客户端引用。

创建测试项目与引用
dotnet new xunit -n TaskDesk.Client.Tests --framework net10.0
dotnet add TaskDesk.Client.Tests/TaskDesk.Client.Tests.csproj reference TaskDesk.Client/TaskDesk.Client.csproj

新增完整测试文件,检查空白与长度边界,避免按钮状态与提交规则不一致。

TaskDesk.Client.Tests/TitleRulesTests.cs
using TaskDesk.Client;
using Xunit;

public sealed class TitleRulesTests
{
[Theory]
[InlineData(null)]
[InlineData("")]
[InlineData(" ")]
public void Blank_title_is_rejected(string? title)
=> Assert.False(TitleRules.IsValid(title));

[Fact]
public void Length_limit_uses_trimmed_title()
{
Assert.True(TitleRules.IsValid(" " + new string('a', 120) + " "));
Assert.False(TitleRules.IsValid(new string('a', 121)));
}
}

执行测试,并另行手工验证键盘导航、窗口缩放、焦点和错误提示。测试绿色不能证明整个真实界面已经通过。

运行测试
dotnet test TaskDesk.Client.Tests/TaskDesk.Client.Tests.csproj

发布:选择运行时与架构​

框架依赖发布体积较小,目标机需要匹配的 .NET Desktop Runtime;自包含发布携带运行时,体积较大,仍限定 Windows 和发布架构。下面从仓库根目录执行,输出目录与构建源码分开。

发布 win-x64 客户端
dotnet publish examples/TaskDesk/TaskDesk.Client/TaskDesk.Client.csproj -c Release -r win-x64 --self-contained false -o artifacts/client-framework
dotnet publish examples/TaskDesk/TaskDesk.Client/TaskDesk.Client.csproj -c Release -r win-x64 --self-contained true -o artifacts/client-self-contained

可加 -p:PublishSingleFile=true,但配置与依赖仍可能独立存在,应分发完整输出。WPF 不要默认开启裁剪或 Native AOT,应先核对支持。正式分发可用 MSIX 或安装程序,并规划签名、升级与回滚。

常见错误​

测试项目仍为 net10.0 时引用 Windows 专用项目,可能出现目标框架兼容错误。发布 x64 后交给其他架构却不验证,也会造成启动失败。只在开发机测试掩盖了运行时、配置与权限问题;不要把 bin/Debug 当成经过验收的发布目录。

练习与验收​

发布到独立目录,在另一台干净 Windows 环境运行。验收:能找到配置、显示主窗口、连接指定 API、完成新增与删除;停掉 API 后显示可理解的失败提示;关闭后进程结束。分别检查框架依赖包与自包含包对目标机运行时的要求,并记录真实结果,未执行的步骤标为待验证。

官方资料​

继续实践:任务管理客户端。