如何在端到端测试(Selenium)中启动Blazor Server应用(.NET7)
Blazor Server 集成测试(SpecFlow+NUnit)启动方案
核心概念说明
- WebApplicationFactory<>:这是.NET官方集成测试工具,它默认在内存中托管应用,不会绑定真实HTTP端口,所以依赖真实地址的Selenium无法直接访问——这就是你之前用它失败的核心原因。
- Blazor Server 启动本质:Blazor Server基于ASP.NET Core构建,启动它本质是启动一个ASP.NET Core宿主,只要让宿主绑定到
http://localhost:5000这类真实端口,Selenium就能正常访问客户端。 - SpecFlow BeforeScenario:场景执行前的钩子方法,适合在这里启动服务,确保每个测试场景能基于干净的应用实例运行。
最简实现方案
1. 测试项目依赖
确保测试项目安装以下NuGet包(适配.NET 7):
Microsoft.AspNetCore.Server.KestrelSpecFlow.NUnitNUnitNUnit3TestAdapter- 直接添加你的Blazor Server项目引用
2. 封装服务启动管理类
创建静态类统一处理服务的启动/停止逻辑:
using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; public static class BlazorServerHostManager { private static IHost? _host; public static void StartServer(string url = "http://localhost:5000") { if (_host != null) return; _host = Host.CreateDefaultBuilder() .ConfigureWebHostDefaults(webBuilder => { // 替换为你的Blazor项目Startup类(若用顶级语句则替换为Program类) webBuilder.UseStartup<YourBlazorServerProject.Startup>(); webBuilder.UseUrls(url); }) .Build(); _host.StartAsync().GetAwaiter().GetResult(); } public static void StopServer() { if (_host == null) return; _host.StopAsync().GetAwaiter().GetResult(); _host.Dispose(); _host = null; } }
注:如果你的Blazor项目用的是.NET 6+顶级语句(无Startup类),将
UseStartup<Startup>替换为UseApplication<Program>即可。
3. 绑定SpecFlow钩子
创建钩子类,在场景前后自动启停服务:
using TechTalk.SpecFlow; [Binding] public class BlazorServerHooks { [BeforeScenario] public void BeforeScenario() { BlazorServerHostManager.StartServer("http://localhost:5000"); } [AfterScenario] public void AfterScenario() { BlazorServerHostManager.StopServer(); } }
4. Selenium客户端调用示例
现在Selenium可直接访问指定地址,步骤定义示例:
using OpenQA.Selenium.Chrome; [Binding] public class YourStepDefinitions { private ChromeDriver? _driver; [Given(@"打开Blazor应用")] public void Given打开Blazor应用() { _driver = new ChromeDriver(); _driver.Navigate().GoToUrl("http://localhost:5000"); } [AfterScenario] public void CleanupDriver() { _driver?.Quit(); _driver?.Dispose(); } }
扩展建议
- 若需多个场景共享服务实例,可将启停逻辑移至
BeforeTestRun和AfterTestRun钩子。 - 添加端口占用检测逻辑,避免启动失败。
- 通过配置文件管理启动地址,适配不同测试环境。
内容的提问来源于stack exchange,提问作者Nico Hollmann
相关产品推荐
相关产品推荐

