上下文
作为使用BATS进行测试的Bash脚本的一部分,我注意到当我运行一个激活ssh帐户的函数时,我的测试不会终止。
代码
下面的函数假设/home/<username>/.ssh/中存在私有和公共ssh密钥对。如果我使用source src/the_bash_script.sh && activate_ssh_account <my_git_username>手动运行它,它会工作,并表示为Identity added: /home/name/.ssh/<my_git_email>。
#!/bin/bash
# Activates/enables the ssh for
activate_ssh_account() {
git_username=$1
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/"$git_username"
}但是,当它从测试中运行时:
#!./test/libs/bats/bin/bats
load 'libs/bats-support/load'
load 'libs/bats-assert/load'
# https://github.com/bats-core/bats-file#Index-of-all-functions
load 'libs/bats-file/load'
# https://github.com/bats-core/bats-assert#usage
load 'assert_utils'
source src/the_bash_script.sh
@test "Check if ssh-account is activated after activating it." {
activate_ssh_account "some_git_username"
assert_equal "Something" "Something_else"
}它无限期地挂着。
问题
如何激活ssh帐户而不导致BATS测试无限期挂起?
发布于 2021-11-22 17:23:09
测试无限期挂起,因为BATS等待ssh-agent终止(在执行eval "$(ssh-agent -s)"行后在后台运行)。更确切地说,BATS等待文件描述符3被关闭(ssh-agent正在打开该文件描述符)。
因此,可以通过实现文档中提到的解决方法或杀死ssh-agent来解决这一问题。
文档解决方案:
#!/bin/bash
# Activates/enables the ssh for
activate_ssh_account() {
git_username=$1
eval "$(ssh-agent -s 3>&-)"
ssh-add ~/.ssh/"$git_username"
}这关闭了fd 3的ssh-agent和BATS将不再挂起。请注意,这使得ssh-agent在后台运行,即使在BATS退出之后也是如此。从你的问题上看,这是否是想要的还不清楚。如果不是,请使用下面的替代方法。
ssh-agent**:** Kill
向activate_ssh_account添加清理陷阱
#!/bin/bash
# Activates/enables the ssh for
activate_ssh_account() {
trap "trap - RETURN; kill \$SSH_AGENT_PID" RETURN
git_username=$1
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/"$git_username"
}当函数退出并使用由ssh-agent导出的pid (即变量SSH_AGENT_PID)终止eval "$(ssh-agent -s)"时,就会执行这个陷阱。
如果您出于某种原因不想使用陷阱,这也会奏效:
#!/bin/bash
# Activates/enables the ssh for
activate_ssh_account() {
git_username=$1
eval "$(ssh-agent -s)"
result=0
ssh-add ~/.ssh/"$git_username" || result=$?
kill $SSH_AGENT_PID
return $result
}请注意,||构造是必要的,因为BATS将在命令失败后停止执行函数的代码(也就是说,如果没有||,如果ssh-add失败,kill将不会被执行)。
另外,要实际测试activate_ssh_account是否成功或失败,您应该使用assert_success而不是assert_equal (除非在您的问题中遗漏了更多的代码)。
发布于 2021-11-22 00:11:12
我从未使用过BATS,但通过阅读文档,我可以说有一个用于共享公共代码的特定命令。但是,您可能需要指定完整的路径:
load**:共享公共代码** 您可能希望在多个测试文件之间共享公共代码。Bats包括一个方便的加载命令,用于相对于当前测试文件的位置获取Bash源文件。例如,如果您在test/foo.bats中进行了Bats测试,则命令load test_helper将在您的测试文件中提供脚本test/ test _helper.bash。这对于共享函数来设置您的环境或加载固定装置非常有用。
Option1:
试着替换
source src/the_bash_script.sh使用
load '/full/path/to/src/the_bash_script.sh'备选案文2:
尝试在@test中添加资源
@test "Check if ssh-account is activated after activating it." {
source /full/path/to/src/the_bash_script.sh
activate_ssh_account "some_git_username"
assert_equal "Something" "Something_else"
}https://stackoverflow.com/questions/70019172
复制相似问题