相关疑难解决方法(0)

单元测试bash脚本

我们有一个除了Java代码之外还运行一些bash脚本的系统.由于我们正在尝试测试可能会破坏的所有内容,并且这些bash脚本可能会中断,我们希望对它们进行测试.

问题是很难测试bash脚本.

有没有办法或最佳实践来测试bash脚本?或者我们应该退出使用bash脚本并寻找可测试的替代解决方案?

testing bash tdd automated-tests extreme-programming

101
推荐指数
8
解决办法
6万
查看次数

从shell脚本导入函数

我有一个shell脚本,我想用shUnit测试.脚本(和所有功能)都在一个文件中,因为它使安装更容易.

示例 script.sh

#!/bin/sh

foo () { ... }
bar () { ... }

code
Run Code Online (Sandbox Code Playgroud)

我想编写第二个文件(不需要分发和安装)来测试中定义的函数 script.sh

就像是 run_tests.sh

#!/bin/sh

. script.sh

# Unit tests
Run Code Online (Sandbox Code Playgroud)

现在的问题在于.(或source在Bash中).它不仅解析函数定义,还执行脚本中的代码.

由于没有参数的脚本没有任何坏处,我可以

. script.sh > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

但如果有更好的方法来实现我的目标,我就会徘徊.

编辑

我建议的解决方法在源脚本调用的情况下不起作用,exit所以我必须捕获退出

#!/bin/sh

trap run_tests ERR EXIT

run_tests() {
   ...
}

. script.sh
Run Code Online (Sandbox Code Playgroud)

run_tests调用该函数但是只要我重定向source命令的输出,脚本中的函数就不会被解析,并且在陷阱处理程序中不可用

这有效,但我得到的输出script.sh:

#!/bin/sh
trap run_tests ERR EXIT
run_tests() {
   function_defined_in_script_sh
}
. script.sh
Run Code Online (Sandbox Code Playgroud)

这不打印输出但是我得到一个错误,该函数未定义:

#!/bin/sh
trap run_tests ERR EXIT
run_tests() {
   function_defined_in_script_sh
}
. script.sh …
Run Code Online (Sandbox Code Playgroud)

shell

48
推荐指数
3
解决办法
4万
查看次数

Bash和测试驱动开发

在bash中编写多个简单的脚本时,我常常想知道如何使代码可测试.

通常很难为bash代码编写测试,因为它在获取值并返回值的函数上很少,而在检查和设置环境中的某些方面的函数中很高,修改文件系统,调用程序等 - 依赖于环境或具有副作用的功能.因此,设置和测试代码变得比它们测试的代码复杂得多.


例如,考虑一个简单的测试函数:

function add_to_file() {
  local f=$1
  cat >> $f
  sort -u $f -o $f
}
Run Code Online (Sandbox Code Playgroud)

此功能的测试代码可能包括:

add_to_file.before:

foo
bar
baz
Run Code Online (Sandbox Code Playgroud)

add_to_file.after:

bar
baz
foo
qux
Run Code Online (Sandbox Code Playgroud)

和测试代码:

function test_add_to_file() {
   cp add_to_file.{before,tmp}
   add_to_file add_to_file.tmp
   cmp add_to_file.{tmp,after} && echo pass || echo fail
   rm add_to_file.tmp
}
Run Code Online (Sandbox Code Playgroud)

这里有5行代码由6行测试代码和7行数据测试.


现在考虑一个稍微复杂的案例:

function distribute() {
   local file=$1 ; shift
   local hosts=( "$@" )
   for host in "${hosts[@]}" ; do
     rsync -ae ssh $file $host:$file
   done
}
Run Code Online (Sandbox Code Playgroud)

我甚至不能说如何开始为此测试...


那么,有一个很好的方法在bash脚本中做TDD,还是我应该放弃并把我的努力放在别的地方?

bash tdd

40
推荐指数
4
解决办法
1万
查看次数