如何为Protractor并行测试创建可存取的登录账号池
解决afterEach获取测试对应账号的方法
你可以直接将分配到的账号挂载到当前测试的实例上下文上,Protractor默认使用的Jasmine框架中,非箭头函数定义的钩子和测试块的this指向当前测试实例,你可以直接在beforeEach中写入账号,afterEach中读取:
// 注意不要用箭头函数定义beforeEach,否则会丢失this指向 beforeEach(async function() { // 调用账号池逻辑获取空闲账号 const availableAccount = testAccountPool.acquire(); // 挂载到当前测试实例上下文 this.currentTestAccount = availableAccount; // 执行你的登录逻辑 await login(availableAccount.username, availableAccount.password); }); afterEach(async function() { // 直接从当前测试上下文读取使用的账号 const usedAccount = this.currentTestAccount; // 执行登出逻辑 await logout(); // 归还账号到账号池 testAccountPool.release(usedAccount); });
更优的账号池管理方案
你最初的二维数组标记占用的方案存在遍历效率低、并发读写竞态的问题,推荐使用双集合+超时回收的实现方案,示例如下:
class AccountPool { constructor(accountList) { // 存储空闲账号 this.freeAccounts = new Set(accountList); // 存储已占用账号 this.usedAccounts = new Set(); // 存储账号占用时间,用于异常场景的超时回收 this.occupyTimeMap = new Map(); // 单账号最长占用时间,可根据你的单条测试最大允许时长调整 this.maxOccupyTime = 10 * 60 * 1000; } // 申请账号 acquire() { // 先回收超时未归还的账号,避免测试崩溃导致的账号占坑 const now = Date.now(); for(const [account, occupyTime] of this.occupyTimeMap.entries()) { if(now - occupyTime > this.maxOccupyTime) { this.release(account); } } if(this.freeAccounts.size === 0) { // 无空闲账号时可按需加入重试等待逻辑 throw new Error("No available test account"); } // 取出第一个空闲账号 const account = this.freeAccounts.values().next().value; this.freeAccounts.delete(account); this.usedAccounts.add(account); this.occupyTimeMap.set(account, now); return account; } // 归还账号 release(account) { if(this.usedAccounts.has(account)) { this.usedAccounts.delete(account); this.freeAccounts.add(account); this.occupyTimeMap.delete(account); } } } // 初始化账号池,传入你配置的可用账号列表 const testAccountPool = new AccountPool([ {username: "test01@example.com", password: "xxxxxx"}, {username: "test02@example.com", password: "xxxxxx"}, // 剩余账号依次填写 ]);
注意事项
- 如果你的Protractor并行是多进程模式,内存级别的账号池无法跨进程共享状态,需要把账号池状态持久化到本地JSON文件、sqlite等存储介质,每次取/还账号都读写持久化存储即可。
- 不要用箭头函数定义
beforeEach、afterEach和it块,否则会丢失测试实例的this指向,无法挂载/读取当前测试的账号信息。 - 可以在账号申请逻辑中加入重试逻辑,如果第一次拿不到空闲账号,等待几百毫秒再重试几次,避免短时间账号不足导致的测试失败。
内容的提问来源于stack exchange,提问作者DeveloperSM
相关产品推荐
相关产品推荐

