使用Playwright对ASP.NET Core应用执行功能测试

前言

在前面的文章中,我们已经介绍过 Playwright for .NET,它常用于自动化测试已经部署好的 Web 应用。

其实,开发人员也可以使用它在 ASP.NET Core 应用程序中进行功能测试。.

功能测试

功能测试是从用户角度编写,用于基于其要求验证系统的正确性。由于功能测试在系统级别运行,所以可能需要一定程度的UI自动化。

目前常用的实现方式[1],是验证给定的路由(比如"/")是否返回预期的成功状态代码和 HTML 输出,例如:

[Fact]
public async Task ReturnsHomePageWithProductListing()
{
    // Arrange & Act
    var response = await Client.GetAsync("/");
    response.EnsureSuccessStatusCode();
    var stringResponse = await response.Content.ReadAsStringAsync();

    // Assert
    Assert.Contains(".NET Bot Black Sweatshirt", stringResponse);
}

测试案例

但是,这样测试不能保证用户交互后是否返回预期的输出。

例如,我们需要测试,点击“Privacy”链接,显示正确的页面数据,如下图:

使用Playwright对ASP.NET Core应用执行功能测试

这时,我们就可以使用 Playwright for .NET 来编写功能测试。

编写代码

在 WebApplication1 解决方案中添加 XUnit 项目,引用 nuget 包Microsoft.Playwright

像普通自动化测试那样,编写测试用例代码:

const string BaseURL = "http://localhost:5000";

[Fact]
public async Task Test1()
{
    var playwright = await Playwright.CreateAsync();
    var browser = await playwright.Chromium.LaunchAsync();
    
    var page = await browser.NewPageAsync();
    await page.GotoAsync(BaseURL);

    await page.ClickAsync("a[href='/Privacy']");

    var handle = await page.WaitForSelectorAsync("h1");
    var text = await handle.InnerTextAsync();
    Assert.Equal("Privacy Policy", text);
}

启动应用

现在测试还不能正常执行,因为我们是在解决方案中进行测试,并没有真正启动应用,导致 Playwright 无法浏览 BaseURL。

因此,我们需要在测试代码顶部启动应用。

实现方式也很简单,直接调用Program.cs的CreateHostBuilder方法启动站点:

public async Task Test1()
{
    await WebApplication1.Program.CreateHostBuilder(new string[] { $@"--urls={BaseURL}" }).Build().StartAsync();

这里有个小技巧,我们传递--urls参数,指定了应用默认地址。

现在,功能测试可以正常执行,并通过测试了。

结论

功能测试可以确保应用程序的前端按预期运行,使用 Playwright for .NET 保证了用户交互也是按预期执行。