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

BATS测试中run bash -c调用函数多参传递失败且需保留assert_failure如何解决

问题根源

你的参数传递失败是两个原因共同导致的:

  1. 用单引号包裹了bash -c的执行命令,单引号内的变量不会在测试用例的当前上下文展开,只会传入bash -c启动的子shell中解析,而子shell无法访问测试用例中未export的局部变量,导致变量取值为空。
  2. 你在some_function调用后直接加了换行,会导致后续参数和函数名被截断,无法正常传递。
解决方案

以下两种方案都不需要导出全局变量,完全满足你的需求:

方案1:直接调用函数(推荐)

BATS的run命令原生支持直接调用当前上下文中的函数,不需要额外套bash -c,写法最简洁,也不会有变量作用域问题:

load 'libs/bats-support/load'
load 'libs/bats-assert/load'
load 'libs/bats-file/load'
load 'assert_utils'

@test "Perform some test." {
  variable_one="one"
  variable_two="two"
  variable_three="three"
  variable_four="four"
  # 先加载目标脚本,将函数导入当前测试上下文
  source src/some_script.sh
  # 直接调用函数并传递参数
  run some_function "$variable_one" "$variable_two" "$variable_three"
  assert_failure
  assert_output "$expected_error_message"
}

每个BATS测试用例都是独立的执行环境,不会出现跨用例的变量污染问题。

方案2:子shell传递位置参数

如果你确实需要用独立子shell执行(比如要完全隔离执行环境),可以把变量作为位置参数传递给bash -c的命令串:

load 'libs/bats-support/load'
load 'libs/bats-assert/load'
load 'libs/bats-file/load'
load 'assert_utils'

@test "Perform some test." {
  variable_one="one"
  variable_two="two"
  variable_three="three"
  variable_four="four"
  # 下划线用来占位子shell的$0参数,后续传入的变量会按顺序对应命令串内的$1、$2、$3
  run bash -c 'source src/some_script.sh && some_function "$1" "$2" "$3"' _ "$variable_one" "$variable_two" "$variable_three"
  assert_failure
  assert_output "$expected_error_message"
}

内容的提问来源于stack exchange,提问作者a.t.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:45:04