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

如何让Playwright Worker在NUnit测试中执行不同逻辑分支?

实现Playwright测试中按Worker ID区分逻辑的方案

核心思路

利用NUnit提供的TestContext获取当前Worker的ID,基于该ID动态生成唯一用户标识和差异化操作逻辑,既支持小批量并行测试,也能平滑扩展到5000个Worker的大规模并发场景。

步骤1:获取Worker ID

在测试方法或测试类中,通过TestContext.CurrentContext.WorkerId直接获取当前运行的Worker编号(从1开始递增)。

步骤2:基于Worker ID实现差异化逻辑

不需要为每个Worker ID硬编码分支,而是通过Worker ID生成唯一的用户数据(如用户名、消息内容),再根据ID的规则(如奇偶、区间)执行不同操作,示例代码如下:

using NUnit.Framework;
using Microsoft.Playwright;

[TestFixture]
public class ChatRoomTests
{
    [Test]
    public async Task TestConcurrentUserMessageUpdates()
    {
        // 获取当前Worker的ID
        int workerId = TestContext.CurrentContext.WorkerId;
        
        // 生成唯一用户标识和消息内容
        string uniqueUsername = $"ChatUser_{workerId}";
        string userMessage = $"Worker {workerId}: Test message at {DateTime.Now:HH:mm:ss.fff}";

        // 启动无头浏览器实例,优化资源占用
        using var playwright = await Playwright.CreateAsync();
        await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
        {
            Headless = true,
            Args = new[] { "--disable-gpu", "--no-sandbox" }
        });
        var page = await browser.NewPageAsync();

        // 访问Blazor聊天室并登录
        await page.GotoAsync("https://your-blazor-chat-url");
        await page.FillAsync("#username-input", uniqueUsername);
        await page.ClickAsync("#login-btn");

        // 根据Worker ID执行差异化操作
        if (workerId % 3 == 0)
        {
            // 每3个Worker执行特殊操作(发送带标签的消息)
            await page.FillAsync("#message-input", $"[NOTICE] {userMessage}");
        }
        else
        {
            // 其他Worker发送普通消息
            await page.FillAsync("#message-input", userMessage);
        }
        await page.ClickAsync("#send-btn");

        // 验证消息是否成功发送(可选)
        var sentMessageLocator = page.Locator($"div.chat-message:has-text('{userMessage}')");
        await sentMessageLocator.WaitForAsync(new LocatorWaitForOptions { Timeout = 5000 });

        // 清理资源
        await page.CloseAsync();
    }
}

步骤3:配置大规模并发测试

要支持5000个Worker,需调整NUnit的并行配置:

  • 命令行启动时指定Worker数量:
    dotnet test -- NUnit.NumberOfTestWorkers=5000 NUnit.Parallelize.TestLevel=Assembly
    
  • 或在测试项目的nunit.config中添加配置:
    <?xml version="1.0" encoding="utf-8"?>
    <nunit>
      <testSettings>
        <parallelization enabled="true" workers="5000" scope="Assembly" />
      </testSettings>
    </nunit>
    

大规模并发注意事项

  • 资源控制:5000个Worker会占用大量CPU、内存和网络资源,建议先从小规模(如100、500个Worker)测试,逐步调整服务器配置;Playwright启用无头模式并添加--no-sandbox等参数优化资源占用。
  • 避免硬编码:不要为每个Worker ID写单独的if/else分支,通过Worker ID动态生成数据和操作规则,确保扩展时无需修改代码。
  • 数据隔离:用Worker ID保证用户标识、消息内容的唯一性,避免测试数据冲突。
  • 应用端适配:提前优化Blazor Server应用的并发能力,比如调整SignalR连接数限制、增加服务器进程数、启用分布式缓存等,避免应用因压力过大崩溃。

内容的提问来源于stack exchange,提问作者user4779

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:45:48