使用 WebApplicationFactory 对 .Net 6 进行 E2E 测试(最小 api)

Inx*_*x51 3 testing .net-6.0

我正在尝试让 E2E/UI 测试(selenium、playwright)与我的单元测试框架配合使用。

基本思想是使用 MSTest 和 WebApplicationFactory 在我的单元测试中启动“真实服务器”。这样做的原因是为了避免部署/发布我的应用程序进行测试(我想这可以通过使用容器等来完成,遗憾的是......我不允许使用容器)。我还认为这样做是一种模拟任何调用外部服务的代码的“巧妙”方式,并且能够为这些外部调用创建具有不同场景的多个测试。

我在网上搜索了一种执行此操作的方法,但我所能找到的只是有关如何在以前的 .Net 版本(2.1-5)中执行此操作的帖子,但自 .Net 6 以来,“启动仪式”代码已更改,并且现在的标准方法是使用最小的 API。

这是来自 Scott.H 的博客文章,他基本上正在做我计划做的事情,但是使用 .Net 2.1: https: //www.hanselman.com/blog/real-browser-integration-testing-with-selenium -独立-chrome-和-aspnet-core-21

到目前为止我所做的是创建一个继承自 WebApplicationFactory 的自定义类。

基本上:

class MyAppFactory : WebApplicationFactory<Program> {

}
Run Code Online (Sandbox Code Playgroud)

我可以完美地使用它来进行集成测试。然而..使用该类时初始化的服务器不接受http调用,所以我无法使用网络浏览器访问该服务器,selenium也不能。

我试图关注斯科特的博客文章。但由于某种原因:

protected override TestServer CreateServer(IWebHostBuilder builder)
Run Code Online (Sandbox Code Playgroud)

从未被调用过..(不确定这是否需要最少的 API 和 .Net 6 来完成)。

有没有人设法使用 WebApplicationFactory 和 .Net 6 Minimal API 在内存中启动接受 http 调用的“实际服务器”?

dev*_*pro 6

我在迁移到 .NET 6 时遇到了同样的问题,并通过 Marius Steinbach 的这篇博客文章找到了解决方案。

脚步:

  • 确保Program.cs文件中有程序定义
var builder = WebApplication.CreateBuilder(args);

// adds services to the container
builder.Services.AddRazorPages();

var app = builder.Build();

// configures the HTTP request pipeline
app.UseExceptionHandler("/Error");
app.UseHsts();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();

app.Run();

public partial class Program { }
Run Code Online (Sandbox Code Playgroud)
  • 创建一个新类WebApplicationFactoryFixture示例
var builder = WebApplication.CreateBuilder(args);

// adds services to the container
builder.Services.AddRazorPages();

var app = builder.Build();

// configures the HTTP request pipeline
app.UseExceptionHandler("/Error");
app.UseHsts();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();

app.Run();

public partial class Program { }
Run Code Online (Sandbox Code Playgroud)
  • 在测试类(样本)中使用这个工厂
public class WebApplicationFactoryFixture<TEntryPoint> : WebApplicationFactory<TEntryPoint>
    where TEntryPoint : class
 {
    public string HostUrl { get; set; } = "https://localhost:5001"; // we can use any free port

    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.UseUrls(HostUrl);
    }

    protected override IHost CreateHost(IHostBuilder builder)
    {
        var dummyHost = builder.Build();

        builder.ConfigureWebHost(webHostBuilder => webHostBuilder.UseKestrel());

        var host = builder.Build();
        host.Start();

        return dummyHost;
    }
}
Run Code Online (Sandbox Code Playgroud)

有用!

示例通过此存储库中 Azure DevOps 中的 CI 管道进行验证。