如何使用Protractor+Jasmine重复执行同一测试用例并传入不同参数
解决方案:用不同账号重复执行测试套件
方法1:在测试文件中动态生成describe块
把测试逻辑封装成可复用函数,遍历账号列表生成独立的describe块,每个块对应一组账号:
// 封装测试逻辑的复用函数 function runLoginTests(userLabel: string, username: string, password: string, sddcId: string) { describe(`Some work - ${userLabel}`, () => { beforeEach(() => { // 使用传入的账号执行登录流程 browser.get('/login'); element(by.id('username')).sendKeys(username); element(by.id('password')).sendKeys(password); element(by.id('submit')).click(); }); // 你的核心测试用例 it('should load dashboard successfully', () => { expect(element(by.id('dashboard')).isDisplayed()).toBe(true); // 其他测试断言逻辑... }); // 可添加更多测试用例 }); } // 从配置参数中读取账号列表,生成两次测试 const testAccounts = [ { label: '普通用户', username: browser.params.login.username, password: browser.params.login.password, sddcId: browser.params.sddc_id }, { label: 'D权限用户', username: browser.params.login.username_d, password: browser.params.login.password_d, sddcId: browser.params.d_sddc_id } ]; testAccounts.forEach(account => { runLoginTests(account.label, account.username, account.password, account.sddcId); });
方法2:通过Protractor配置重复执行Spec文件
不修改测试文件,通过配置重复Spec路径,配合参数标识切换账号:
修改Protractor配置文件:
exports.config = { // 保留原有配置项... specs: [ './e2e/xyz/xyz.e2e-spec.ts', './e2e/xyz/xyz.e2e-spec.ts' // 重复Spec路径,触发两次执行 ], params: { // 保留原有参数 login: { username: nconf.get('USERNAME'), password: nconf.get('PASSWORD'), username_d: nconf.get('D_USERNAME'), password_d: nconf.get('D_PASSWORD') }, // 添加账号切换标识 activeAccount: 'default' }, onPrepare: function () { // 保留原有onPrepare逻辑... // 根据当前执行的Spec索引切换账号参数 const specIndex = browser.processedSpecs.indexOf(browser.currentSpec); if (specIndex === 1) { browser.params.activeAccount = 'd_user'; } } }
修改测试文件适配参数:
describe('Some work', () => { let username: string; let password: string; let sddcId: string; beforeEach(() => { // 根据标识选择对应账号 if (browser.params.activeAccount === 'd_user') { username = browser.params.login.username_d; password = browser.params.login.password_d; sddcId = browser.params.d_sddc_id; } else { username = browser.params.login.username; password = browser.params.login.password; sddcId = browser.params.sddc_id; } // 执行登录流程 browser.get('/login'); element(by.id('username')).sendKeys(username); element(by.id('password')).sendKeys(password); element(by.id('submit')).click(); }); // 核心测试用例... });
方法3:Jasmine数据驱动测试(单用例级重复)
如果不需要重复整个describe,只是让单个测试用例针对多账号执行,可直接在describe内循环生成it块:
describe('Some work', () => { const testAccounts = [ { label: '普通用户', username: browser.params.login.username, password: browser.params.login.password }, { label: 'D权限用户', username: browser.params.login.username_d, password: browser.params.login.password_d } ]; testAccounts.forEach(account => { it(`should complete workflow for ${account.label}`, () => { // 登录+测试逻辑 browser.get('/login'); element(by.id('username')).sendKeys(account.username); element(by.id('password')).sendKeys(account.password); element(by.id('submit')).click(); expect(element(by.id('dashboard')).isDisplayed()).toBe(true); // 其他测试步骤... }); }); });
内容的提问来源于stack exchange,提问作者Vaishali Soni
相关产品推荐
相关产品推荐

