如何让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
相关产品推荐
相关产品推荐

