今天在kubernetes中部署mongodb-rs时,发现其helm模板中使用到了一个bats,搜索了一下发现这是一个对bash领域的自动化测试框架,简单学习一下.
使用
mongodb-rs的部署不在这里详述了,直接来到使用到bats的地方,
1 |
|
首先看到initContainers执行了cp -R /usr/local/libexec/ /tools/bats/
,从bats github中可以看到,这个目录下是一些可执行的bash代码,这是整个核心.
然后在主containers中执行了/tools/bats/bats -t /tests/mongodb-up-test.sh
, 这个脚本内容如下:
cat mongodb-up-test.sh
1 |
|
该脚本的上半部分可以先忽略
然后定义了几个函数, 其实setup()
函数在bats中是特殊的函数,其实还有一个teardown
,主要用于在执行测试函数前/后执行的两个函数, setup
用于做一些准备工作,teardown
用于做一些清理工作
最重要的部分是@test
,比如:
1 | @test "Testing mongodb client is executable" { |
@test
是一个关键字,指定被包含代码块需要被testing.在上面的脚本中指定了4个@test
函数. 它到底是如何执行的呢?
源码分析
首先: 在bats-preprocess中,这个代码主要是解析待测试脚本,可以发现以下代码:
1 | pattern='^ *@test *([^ ].*) *\{ *(.*)$' |
通过解析@test
来得到有多个需要testing的代码块,从pod的日志中也可以看出
1 | ++ bats_test_function test_Testing_mongodb_client_is_executable |
从日志中可以看到,成功解析到了4个@test
代码块, 然后最后循环调用/tools/bats/bats-exec-test
, 来看看这个函数
传递了三个参数,第一个是脚本文件,第二个是获取到的@test
代码块的名字, 第三个是序号
到/tools/bats/bats-exec-test
,调用这个函数
1 | bats_perform_test() { |
因此,当命令在执行过程出现error时则会被trap捕获到,然后设置错误码
1 | bats_error_trap() { |
这样,一旦生成了错误码,则pod的状态即会出现异常状态,而正常情况下指定了restart:Never的pod执行完启动命令的状态会变成complete.
1 | # kubectl get pod -n infra |
bats还有一些其它的使用技巧, 比如可以使用skip来跳过某些@test
代码块、可以用于@test
网页等.可到github查看
不过batsN久没有更新了, 有一个改良版的bats-core,是在bats的基本之上改良的,感兴趣的可以看看.