Robot Framework报错:期望2个关键词却得4个,如何扩展命令参数?
解决Robot Framework "expected 2 keywords got 4" 报错并合并命令
问题根源
Execute special command on 仅接受2个参数:集群标识、要执行的完整命令。但你写的命令里有大量空格,Robot Framework会把这些空格当成参数分隔符,把一条命令拆成了多个参数,因此触发了参数数量不匹配的报错。
解决方法
核心是把整个要执行的命令作为单个参数传递,Robot Framework里有几种靠谱的实现方式:
方式1:用三重引号包裹命令
直接把合并后的完整命令用"""(三重双引号)包起来,这样空格就不会被解析成参数分隔符。同时把两条kubectl命令用管道连接,写法如下:
Execute special command on ${cluster} """kubectl exec -n ${namespace} statefulsets/postgresql-pod -- get -o yaml | sed "s#image: docker repo/stolon#image: bbbdocker repo/stolon#" | kubectl -n ${namespace} replace -f -"""
注意:原第一条命令里的
kubectl exec必须加--,用来分隔kubectl自身选项和要传递给Pod内部执行的get命令,否则会执行失败。
方式2:先存变量再传递
先把完整命令存入变量,再传给关键字,可读性更好:
*** Variables *** ${UPDATE_IMAGE_CMD} kubectl exec -n ${namespace} statefulsets/postgresql-pod -- get -o yaml | sed "s#image: docker repo/stolon#image: bbbdocker repo/stolon#" | kubectl -n ${namespace} replace -f - *** Test Cases *** Update Docker Image In StatefulSet Execute special command on ${cluster} """${UPDATE_IMAGE_CMD}"""
方式3:反斜杠换行优化长命令
如果命令太长,可用反斜杠换行,同时保留三重引号包裹,方便阅读:
Execute special command on ${cluster} """kubectl exec -n ${namespace} statefulsets/postgresql-pod -- get -o yaml \ | sed "s#image: docker repo/stolon#image: bbbdocker repo/stolon#" \ | kubectl -n ${namespace} replace -f -"""
关键提醒
- 确保整个命令是单一参数,三重引号是Robot Framework处理带空格参数最稳妥的方式。
- 执行Pod内部命令时,
kubectl exec后的--不能省略,否则kubectl会把后续命令当成自身参数解析。
内容的提问来源于stack exchange,提问作者user5539903
相关产品推荐
相关产品推荐

