You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在端到端测试(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.Kestrel
  • SpecFlow.NUnit
  • NUnit
  • NUnit3TestAdapter
  • 直接添加你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:55:18