咨询:如何统计Protractor配置文件中beforeLaunch与afterLaunch执行次数
嘿,我来帮你理清afterLaunch的执行逻辑,以及搞定beforeLaunch/afterLaunch的次数统计问题,尤其是在使用protractor-flake重跑失败用例的场景下。
一、先搞清楚afterLaunch的默认执行次数
默认情况下,afterLaunch是整个测试套件生命周期结束后只执行一次——不管你跑了多少个测试用例、启动了多少个浏览器实例,它都会在所有测试完成、浏览器全部关闭后才运行一次。但你用protractor-flake时,它本质上会重新启动一个完整的Protractor进程来跑失败用例,所以每重启一次,beforeLaunch和afterLaunch就会跟着执行一次,这就是你看到两次执行的原因。
二、统计beforeLaunch和afterLaunch的执行次数
因为每次Protractor进程启动时,内存里的变量都会被重置,所以我们需要用持久化的方式来记录次数,这里给你两个实用方案:
方案1:用本地文件记录(持久化,推荐)
这种方式能把次数永久存在文件里,方便你随时查看:
- 先在Protractor配置文件的同目录下创建一个
hook-exec-count.json文件,初始内容写:
{"beforeLaunch": 0, "afterLaunch": 0}
- 在配置文件里引入Node.js的
fs模块,写一个更新计数的函数,然后在钩子中调用:
const fs = require('fs'); const countFilePath = './hook-exec-count.json'; // 封装更新计数的函数 function updateHookCount(hookName) { // 读取现有计数 const currentCounts = JSON.parse(fs.readFileSync(countFilePath, 'utf8')); // 累加次数 currentCounts[hookName] += 1; // 写回文件 fs.writeFileSync(countFilePath, JSON.stringify(currentCounts, null, 2)); // 在控制台打印,方便实时查看 console.log(`✅ *${hookName}* 已执行 ${currentCounts[hookName]} 次`); } exports.config = { // 你的其他配置项(比如specs、capabilities等)... beforeLaunch: function() { updateHookCount('beforeLaunch'); // 这里放你原来的beforeLaunch逻辑 }, afterLaunch: function(exitCode) { updateHookCount('afterLaunch'); // 这里放你原来的afterLaunch逻辑 return exitCode; // 记得返回退出码,不影响Protractor的流程 } };
每次执行(包括protractor-flake的重跑),这个文件都会自动更新计数,你可以直接打开文件看,也能在控制台实时看到输出。
方案2:用环境变量记录(仅当前会话有效)
如果你只需要在当前命令行会话中统计次数,不需要持久化,那可以用环境变量:
exports.config = { // 其他配置项... beforeLaunch: function() { // 从环境变量读取现有次数,没有就默认0 let execCount = parseInt(process.env.BEFORE_LAUNCH_COUNT || 0); execCount += 1; // 更新环境变量 process.env.BEFORE_LAUNCH_COUNT = execCount.toString(); console.log(`✅ *beforeLaunch* 已执行 ${execCount} 次`); // 原有逻辑... }, afterLaunch: function(exitCode) { let execCount = parseInt(process.env.AFTER_LAUNCH_COUNT || 0); execCount += 1; process.env.AFTER_LAUNCH_COUNT = execCount.toString(); console.log(`✅ *afterLaunch* 已执行 ${execCount} 次`); // 原有逻辑... return exitCode; } };
注意:这种方式在关闭命令行窗口后,环境变量就会重置,所以如果需要长期记录,还是选方案1更靠谱。
三、额外小提示
如果你想在重跑时跳过某些beforeLaunch/afterLaunch里的逻辑,可以通过process.argv来判断是否是protractor-flake的重跑进程——比如检查参数里是否包含--failedTests(具体参数可以看protractor-flake的文档),然后选择性执行代码,避免重复做不必要的操作。
内容的提问来源于stack exchange,提问作者akhila anumolu

