Codeception单元测试中如何在暂停时注入OTP Code?
Codeception中暂停后注入OTP验证码的解决方案
问题背景
我们有两个测试场景:
- 账户绑定(将银行账号注册至服务);
- 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:
- 执行测试前设置环境变量:
export TEST_OTP_CODE=123456
- 在测试代码中读取变量:
// 替换暂停逻辑为读取环境变量 $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
相关产品推荐
相关产品推荐

