You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Codeception单元测试中如何在暂停时注入OTP Code?

Codeception中暂停后注入OTP验证码的解决方案

问题背景

我们有两个测试场景:

  1. 账户绑定(将银行账号注册至服务);
  2. OTP验证(输入发送至客户手机的OTP验证码)。

账户绑定的部分响应需用于第二个场景,但需在第二步前注入OTP Code的值。目前已在Codeception中使用Codeception\Lib\Actor\Shared\Pause实现暂停,但Hoa\Console项目已废弃,暂停后不知如何注入OTP Code,求解决方案或搜索关键词参考。

测试代码示例

public function testVerificationFlow()
{
    $faker = Faker\Factory::create();
    
    $sequence = '0000';
    $partnerReferenceNo = $faker->numerify('###########') . $sequence;
    $bankAccountNo      = $faker->numerify('##########');
    $bankCardNo         = $faker->randomNumber(4, true);
    $limit              = 250000.00;
    $email              = $faker->email();
    $custIdMerchant     = $faker->numerify('##########');
    
    $response = $this->autopay->accountBinding(
        $partnerReferenceNo,
        $bankAccountNo,
        $bankCardNo,
        $limit,
        $email,
        $custIdMerchant
    );

    codecept_debug($response);
    $this->assertEquals($response->responseCode, self::RESP_CODE_ACCOUNT_BINDING);
    
    $otpCode = '';
    
    // 如何在此处注入$otpCode的值?
    $this->pause();

    codecept_debug($otpCode);

    $verifyOtpResponse = $this->autopay->verifyOtp(
        $partnerReferenceNo,
        $response->originalReferenceNo,
        $response->chargeToken,
        $otpCode,
    );

    codecept_debug($verifyOtpResponse);
    $this->assertEquals($verifyOtpResponse->responseCode, self::RESP_CODE_OTP_VERIFY);

}

暂停提示信息(中文翻译)

执行已暂停,启动交互式shell...
输入命令进行尝试:
- 按ENTER继续
- 按TAB自动补全
- 按F5保存命令
- 按F6切换是否自动保存成功的命令
- 按F8查看已保存的命令
- 按F10清空已保存的命令

解决方案

方法1:使用交互式shell直接赋值

在暂停后的交互式shell中,直接给$otpCode变量赋值:

$otpCode = '123456'; // 替换为实际收到的OTP验证码

赋值完成后按ENTER继续测试流程,代码会自动使用该值执行后续的OTP验证步骤。

方法2:自定义控制台输入逻辑(替代废弃的Hoa\Console)

如果内置pause()功能受限,可以自行实现简单的控制台输入逻辑,无需依赖第三方库:
将代码中的$this->pause();替换为以下代码:

$otpCode = readline('请输入OTP验证码:');
// 可选:添加格式验证
if (!preg_match('/^\d{6}$/', $otpCode)) {
    throw new Exception('OTP验证码格式错误,应为6位数字');
}

测试执行到此处时,会直接在控制台提示输入OTP,输入完成后自动继续流程。

方法3:通过环境变量注入OTP(适配非交互式场景)

如果需要在CI/CD等非交互式环境运行测试,可以通过环境变量传递OTP:

  1. 执行测试前设置环境变量:
export TEST_OTP_CODE=123456
  1. 在测试代码中读取变量:
// 替换暂停逻辑为读取环境变量
$otpCode = getenv('TEST_OTP_CODE');
// 未设置环境变量时,降级为手动输入
if (empty($otpCode)) {
    $otpCode = readline('请输入OTP验证码:');
}

搜索关键词参考

  • Codeception interactive shell variable assignment
  • Codeception pause inject input
  • PHP readline for test input
  • Codeception OTP verification test

内容的提问来源于stack exchange,提问作者Prabowo Murti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 06:05:06