如何在C# Windows Forms项目中点击按钮运行XUnit测试项目Example2?
WinForms按钮运行XUnit测试实现方案
1. 安装必要NuGet包
在WinForms项目中通过NuGet包管理器安装:
xunit.runner.utility:提供程序化运行XUnit测试的APIxunit:版本需与Example2测试项目保持一致
2. 添加测试项目引用
右键WinForms项目 → 选择添加 → 项目引用 → 勾选Example2测试项目,点击确定。
3. 编写按钮点击事件逻辑
打开窗体代码文件,为按钮的Click事件添加以下代码(记得替换Example2.YourTestClass为你测试项目中的实际类):
using Xunit.Runner.Common; using Xunit.Sdk; using System.Collections.Generic; using System.Threading.Tasks; using System.Windows.Forms; private async void btnRunTests_Click(object sender, EventArgs e) { var resultLogs = new List<string>(); // 获取测试项目程序集路径 var testAssemblyPath = typeof(Example2.YourTestClass).Assembly.Location; // 初始化XUnit前端控制器 using var controller = new XunitFrontController(AppDomainSupport.Denied, testAssemblyPath); // 发现所有测试用例 var discoveryOptions = TestFrameworkOptions.ForDiscovery(); var testCases = await controller.DiscoverAsync(discoveryOptions, TestMessageSink.Create()); // 配置测试执行接收器,监听结果 var executionSink = new TestMessageSink(); executionSink.MessageEvent += (_, args) => { switch (args.Message) { case TestPassedMessage passed: resultLogs.Add($"✅ {passed.TestDisplayName}"); break; case TestFailedMessage failed: resultLogs.Add($"❌ {failed.TestDisplayName}\n错误信息: {failed.Message}"); break; case TestSkippedMessage skipped: resultLogs.Add($"⚠️ {skipped.TestDisplayName}\n跳过原因: {skipped.Reason}"); break; } }; // 执行测试 var executionOptions = TestFrameworkOptions.ForExecution(); await controller.RunAsync(testCases, executionOptions, executionSink); // 弹出结果窗口 var resultText = string.Join("\n\n", resultLogs); MessageBox.Show(resultText, "测试结果", MessageBoxButtons.OK, resultLogs.Any(log => log.StartsWith("❌")) ? MessageBoxIcon.Error : MessageBoxIcon.Information); }
4. 关键注意事项
- 确保WinForms项目与Example2测试项目的.NET目标框架版本一致,避免兼容性错误。
- 如果测试项目依赖其他工具包(如Moq、AutoFixture),WinForms项目需同步安装对应NuGet包。
- 使用
async/await避免测试执行时UI线程阻塞导致界面假死。
内容的提问来源于stack exchange,提问作者Pablo Ricardo
相关产品推荐
相关产品推荐

