步骤超时
在自动化测试中,异步操作(如网络请求或文件系统操作)可能需要较长的时间来完成,因此,Cucumber 默认为每个异步 hook 和步骤设定了 5000 毫秒的超时时间。如果操作超时,测试将失败。为了适应不同场景的需求,你可以根据需要调整超时时间。
全局超时设置
你可以通过 setDefaultTimeout
方法全局修改超时时间,将默认的 5000 毫秒扩展为更长的时间。例如,将超时设为 60 秒:
JavaScript
const { setDefaultTimeout } = require('cucumber');
setDefaultTimeout(60 * 1000); // 将默认超时设置为 60 秒
这段代码会将所有异步步骤和 hook 的超时限制设置为 60 秒,而不是默认的 5 秒。这个调整适用于整个测试套件中的所有步骤,适合有大量需要等待响应的操作。
针对特定步骤或 hook 设置超时
如果你只想为某些特定的步骤或 hook 修改超时时间,Cucumber 提供了方法来分别设置。下面是如何为 Before
hook 和某个步骤单独设置 60 秒超时的示例:
JavaScript
const { Before, Given } = require('cucumber');
// Before hook 设置超时为 60 秒
Before({timeout: 60 * 1000}, function() {
// 执行一些较慢的操作,比如启动应用、文件系统读写等
});
// 针对特定步骤设置超时为 60 秒
Given(/^a slow step$/, {timeout: 60 * 1000}, function() {
// 执行一些可能比较慢的操作,例如文件系统或网络请求
});
这样,你可以灵活控制每个步骤或 hook 的超时设置,确保测试不会因为超时问题失败,同时为长时间的操作提供足够的执行时间。
禁用超时
在极少数情况下,你可能需要禁用步骤或 hook 的超时功能。这可以通过将超时设置为 -1
来实现,但要特别谨慎使用这种设置。禁用超时意味着步骤或 hook 将无限期等待执行完毕,如果操作出现问题,测试可能会卡住或永远不会结束。因此,除非绝对必要,否则不要禁用超时。
当禁用超时时,你需要自己编写逻辑来监控操作是否超时,并确保整个测试流程不会无限期挂起。以下是禁用超时的示例代码:
JavaScript
const { Before, Given } = require('cucumber');
const Promise = require('bluebird');
// 禁用超时,手动管理超时保护
Given('the operation completes within {n} minutes', {timeout: -1}, function(minutes) {
const milliseconds = (minutes + 1) * 60 * 1000; // 计算最大等待时间
const message = `operation did not complete within ${minutes} minutes`;
// 自定义超时保护机制
return Promise(this.verifyOperationComplete()).timeout(milliseconds, message);
});
在此示例中,我们使用 bluebird
库来设置自定义的超时保护。通过传入超时时间和错误消息,确保即便超时被禁用,仍然能够捕获异常并返回错误。这样可以防止测试无限期挂起。