Karate CLI测试:如何在命令交互中自动输入应答内容
Karate测试CLI交互式输入的实现方案
核心逻辑
利用Karate的listener捕获CLI进程的输出内容,当检测到对应输入提示时,通过进程输出流写入预设应答(需添加换行符\n模拟回车确认)。
完整代码示例
Listener实现类
import com.intuit.karate.ProcessResult; import com.intuit.karate.core.ScenarioRuntime; import com.intuit.karate.junit5.Karate.TestListener; import java.io.OutputStream; import java.io.PrintWriter; public class CliInitListener implements TestListener { private PrintWriter inputWriter; @Override public void beforeScenario(ScenarioRuntime scenarioRuntime) { // 获取CLI进程的输出流,用于写入应答 ProcessResult processResult = scenarioRuntime.getEnv().get("processResult", ProcessResult.class); OutputStream outputStream = processResult.getProcess().getOutputStream(); inputWriter = new PrintWriter(outputStream, true); // 自动刷新流 } @Override public void onProcessOutput(String outputLine) { // 匹配第一个输入提示 if (outputLine.contains("Enter endpoint:")) { inputWriter.println("https://test-api.example.com"); // 写入应答并回车 } // 匹配第二个输入提示(替换为实际CLI的提示文本) else if (outputLine.contains("Enter auth token:")) { inputWriter.println("test-token-789"); } // 匹配第三个输入提示(替换为实际CLI的提示文本) else if (outputLine.contains("Select environment:")) { inputWriter.println("dev"); } } }
Karate测试脚本配置
Background: * def cliProcess = karate.exec('./mycli init') * karate.set('processResult', cliProcess) * configure listener = new com.your.package.CliInitListener() Scenario: 测试mycli init命令的交互式流程 * match cliProcess.exitCode == 0
关键注意事项
- 确保
outputLine.contains()中的文本与CLI实际输出的提示完全匹配(注意大小写、空格、特殊字符),可先手动运行./mycli init复制输出内容核对。 - 必须使用
println()而非print(),换行符是触发CLI确认输入的关键。
内容的提问来源于stack exchange,提问作者karatekid5088
相关产品推荐
相关产品推荐

