本文分析了bats--Bash自动化测试工具的安装、语法、常用指令及常用函数等内容。
上篇文章回顾:学习RAID 01/10/10E的区别

bats 是一个符合 TAP 标准 的 Bash 版测试框架,它使用了一种极为简便的方法来验证命令行程序是否正常运行。

bats 要求 Bash 的最低版本是 3.2.57 ,bats 测试文件实际上一个 bash 的脚本文件,完全可以使用 shell 的语法书写。

一、安装

强烈建议使用源码或者npm安装最新版本, bats 经过多人接手,代码存放比较混乱,某些系统下安装的是旧版本的,目前社区在维护的版本地址为:

https://github.com/bats-core/bats-core.git

01macOS下安装

brew install bats-core复制代码

02CentOS下安装

yum install bats复制代码

03UBuntu下安装

apt-get install bats复制代码

04Windows安装

Windows 平台需要 bash 环境可以使用以下任意一个

  1. Git for Windows Bash (MSYS2 based)

  2. Windows Subsystem for Linux

  3. MSYS2

  4. Cygwin

Windows下推荐使用源码安装或者 npm 的方式进行安装

05使用源码安装

git clone https://github.com/bats-core/bats-core.gitcd bats-core
./install.sh /usr/local
复制代码

06使用Docker安装

docker pull bats/bats
docker run -it --rm bats/bats --version
docker run -it --rm -v "$(pwd):/code" bats/bats /code/test复制代码

07使用npm安装

npm install -g bats复制代码

经过测试 CentOS 下的版本为 2014 年的版本,ubuntu下也不是最新版本,建议使用源码或者npm安装最新版本。

二、语法

测试用例的语法格式为:

#!/usr/bin/env bats@test "grep --version check" {         # 测试用例名称run grep --version                   # 运行的外部命令[ $status -eq 0 ]                    # 断言[ "${lines[0]%% *}" == 'grep' ]      # 断言
}复制代码

每个 Bats 测试文件的评估次数为 n + 1 次,其中 n 是文件中的测试用例数。运行测试脚本时首先计算测试用例的数量,然后遍历测试用例并在独立进程中执行每个测试用例。

在运行测试用例时,Bats使用Bash的 errexit(set -e)选项,这样写在@test 里面的语句都是真理断言。一旦测试用例中的某一个断言失败(某条语句的状态码不是 0)则这个测试用例视为失败。

三、常用指令

01run:运行外部命令

用于测试外部命令然后对它的退出状态和输出状态进行断言。Bats 包含一个 run 的指令,它可以将传入的参数当成命令调用,并且将退出状态和输出状态保存到特殊的全局变量中,以便可以继续在测试用例中增加断言。

比如说我们正在测试 cat:

#!/usr/bin/env bats@test "cat nonexistent_filename check" {                                    # 测试用例名称run cat nonexistent_filename                                              # 运行的外部命令[ $status -eq 1 ]                                                         # 断言[ "$output" == 'cat: nonexistent_filename: No such file or directory' ]   # 断言[ "${lines[0]}" == 'cat: nonexistent_filename: No such file or directory' ] # 断言
}复制代码

这里有三个 Bats 的特殊变量

$status 是命令退出状态码

$output 是命令的标准输出和标准错误的内容

$lines是命令输出内容的数组包含各行内容 cat nonexistent_filename 只有一行内容

02load:使用共享文件

如果想用跨越多个测试文件共享环境变量或者自定义的函数,可以使用 load 指令。共享文件的扩展文件名必须是.bash。load可以使用相对路径或者绝对路径。

使用相对路径的写法是(可以省略扩展文件名):

load test_helper复制代码

使用绝对路径的写法时(必须带上扩展文件名):

load /test_helpers/test_helper.bash复制代码

03skip:跳过测试

在测试过程中如果失败时如果想继续可以 skip 指令来跳过测试:

@test "A test I don't want to execute for now" {skiprun foo[ "$status" -eq 0 ]
}复制代码

也可以加入跳过原因:

@test "A test I don't want to execute for now" {skip "This command will return zero soon, but not now"run foo[ "$status" -eq 0 ]
}复制代码

或者也可以根据条件判断是否跳过:

@test "A test which should run" {  if [ foo != bar ]; thenskip "foo isn't bar"firun foo[ "$status" -eq 0 ]
}复制代码

四、常用函数

01@test

这是 Bats 主要的函数所有的测试用例都要按照这个函数的格式书写:

@test "grep --version check" {         # 测试用例名称run grep --version                   # 运行的外部命令[ $status -eq 0 ]                    # 断言[ "${lines[0]%% *}" == 'grep' ]      # 断言
}复制代码

02setup/teardown初始化和善后函数

setup / teardown 是两个特殊的函数,用于在测试用例开始之前和结束之后进行初始化和善后工作。比如开始之前设置环境变量创建测试目录。以 soar 为测试用例为例:

setup() {export SOAR_DEV_DIRNAME="${BATS_TEST_DIRNAME}/../"export SOAR_BIN="${SOAR_DEV_DIRNAME}/bin/soar" export SOAR_BIN_ENV="${SOAR_DEV_DIRNAME}/bin/soar -config ${SOAR_DEV_DIRNAME}/etc/soar.yaml" export BATS_TMP_DIRNAME="${BATS_TEST_DIRNAME}/tmp"export BATS_FIXTURE_DIRNAME="${BATS_TEST_DIRNAME}/fixture"mkdir -p "${BATS_TMP_DIRNAME}"}teardown(){  //TODO......
}复制代码

五、特殊变量

Bats 中包含几个全局变量 :

  1. $BATS_TEST_FILENAME Bats测试文件的绝对路径。

  2. $BATS_TEST_DIRNAME Bats测试文件所在的目录。

  3. $BATS_TEST_NAMES 每个测试用例的函数名称数组。

  4. $BATS_TEST_NAME 包含当前测试用例的函数的名称。

  5. $BATS_TEST_DESCRIPTION 当前测试用例的描述。

  6. $BATS_TEST_NUMBER 测试文件中当前测试用例的(从1开始)索引。

  7. $BATS_TMPDIR 用于存储临时文件的目录的位置。

六、注意事项

01写在@test之外的代码

写在 @test 函数之外代码一旦失败 Bats 会立刻中断执行,某些情况下这样做会很有用比如检查依赖项,但是如果在@test、setup、teardown之外打印的任何输出必须重定向到stderr(>&2),否则这些输出内容可能会污染TAP流导致Bats 测试失败。

经过测试 @test 之外的代码会优先执行

02文件描述符3(FD3)

如果Bats卡死可以读这一块内容。

Bats 将测试代码的输出流和 TAP 输出流分开,这样做的目的是为了确保 TAP 的输出不被污染。在输出至终端的部分详细介绍了如何使用 FD3 正确打印自定义文本。

但是使用 FD3 的一个已知的问题是:在某些情况下(如程序的子进程在后台运行的时候),它会导致 Bats 卡死。在这种情况下在生成子进程的时候,子进程会从父进程继承 FD3 ,导致Bats 会等待子进程执行完成之后关闭 FD3 。如果子进程需要花费大量时间完成,例如,如果子进程是 sleep 100 命令或是后台服务,那么 Bats 也会阻塞同样的时间。

为了避免这种情况,启动可能长时间运行的子进程之前显式关闭 FD3 command_name 3>&-

举例说明:

1.会卡死的情况:

@test "cat nonexistent_filename check" {            # 测试用例名称run cat nonexistent_filenamesleep 100  &                                      # 后台执行[ $status -eq 1 ]       [ "$TTTT" -eq 1 ]                                 # 断言[ "$output" == 'cat: nonexistent_filename: No such file or directory' ]   # 断言
}复制代码

2. 不会卡死的情况:

@test "cat nonexistent_filename check" {                # 测试用例名称run cat nonexistent_filenamesleep 100 3>&- &                                      # 后台执行并且关闭文件描述符3[ $status -eq 1 ]       [ "$TTTT" -eq 1 ]                                     # 断言[ "$output" == 'cat: nonexistent_filename: No such file or directory' ]   # 断言
}复制代码

03命令输出到终端

  1. 在 @test 函数内部输出

(1)如果从@test 内部输出字符你需要将输出重定向到 FD3 例如 echo 'test'>&3。这时输出将变成 TAP 流的一部分。为了生成100%符合 TAP 流格式的输出,我们推荐的写法是 echo '# text' >&3 。否则,在使用分析 TAP 流的第三方工具时可能会遇到意外错误。

(2)Bats 默认使用友好的输出格式(-p, --pretty)。 TAP 流默认不会从 FD3 中输出任何字符

(3)无论指定何种输出格式,直接输出到 stdout、stderr 的文本(例如 echo "aaaa")会被@test 视为测试的一部分,仅仅在测试失败的时候显示。

在 setup/teardown 函数内部输出

这一部分内容输出行为和@test 中一样。

在 @test 或者setup/teardown 外部输出

(1)无论输出的字符被重定向到何处(FD1、FD2、FD3)字符都会立刻显示到终端

(2)按照这种方式打印的文本将会禁用友好的输出格式(-p, --pretty)。此外他也会使得输出不符合 TAP 流规范。

(3)由内部管道或者重定向输出到标准错误的字符总会第一时间显示出来。

七、Bats命令行用法

bats 命令行用法:

Bats 1.1.0  Usage: bats [-cr] [-f <regex>] [-p | -t] <test>...bats [-h | -v]<test>  为一个 bats 测试用例的文件,或者是一个包含后缀名为 .bats 文件的目录-c, --count      计算没有运行的测试用例的个数-f, --filter     通过正则表达式指定运行某些测试用例-h, --help       显示帮助信息-p, --pretty     以比较友好的方式展现测试用例的输出结果(默认是使用这种方式)-r, --recursive  在子目录中包含测试-t, --tap        以 TAP 格式显示输出结果-v, --version    显示版本号信息复制代码

更多信息见:

https://github.com/bats-core/bats-core复制代码

八、开发工具推荐

在常用的开发工具中安装 Bats 插件,增加代码高亮显示和代码完成提示,提高开发效率。

01VS Code

02Sublime Text

03Vim

九、其他开发工具

更多开发工具和插件参考:

github.com/bats-core/b…

十、参考文献

bats-core:

github.com/bats-core/b…

Bat Evaluation Process:

github.com/sstephenson…

本文首发于公众号”小米运维“,点击查看原文。

bats-Bash自动化测试工具相关推荐

  1. 树莓派自动化测试工具LTF

    树莓派自动化测试工具LTF 一.框架介绍 二.安装自动测试框架LTF 1.安装git 2.下载LTF 三.对树莓派各个项目进行测试 1. Languages Test(支持语言测试) 2.Filesy ...

  2. 自动化测试工具Cucumber的简单介绍

    随着测试的发展,测试自动化越来越成为人们的关注点. 现在我们公司也在进行接口自动化的推广,在我看来接口自动化的价值就在于整体项目的回归,完成一些没法通过人力进行的测试,比如压力测试. 为了解决测试开发 ...

  3. 开源 软件测试自动化工具,开源Web自动化测试工具Selenium IDE

    Selenium IDE(也有简写SIDE的)是一款开源的Web自动化测试工具,支持测试用例的录制与回放. 只要在浏览器里装一下插件,就可以开始使用,简直是"开箱即用".我们相信测 ...

  4. 自动化测试工具的选择

    随着自动化测试的发展,市场上涌现了多款自动化测试工具.其中,绝大部分是商业收费的工具,也有部分是开源工具.但是相对于收费的自动化测试工具,开源工具的功能与使用领域都要逊色很多.好多公司由于本身测试工作 ...

  5. python自动测试p-python网络爬虫之自动化测试工具selenium[二]

    @ 前言 hello,大家好,在上章的内容里我们已经可以爬取到了整个网页下来,当然也仅仅就是一个网页. 因为里面还有很多很多的标签啊之类我们所不需要的东西. 额,先暂且说下本章内容,如果是没有丝毫编程 ...

  6. autorunner测试java代码,AutoRunner自动化测试工具介绍

    AutoRunner简介 AutoRunner是黑盒测试工具,可以用来完成功能测试.回归测试.每日构建测试与自动回归测试等工作.是具有脚本语言的.提供针对脚本完善的跟踪和调试功能的.支持IE测试和Wi ...

  7. 号外号外!自动化测试工具AutoRunner V4.2 新版本升级预告!

    自动化测试工具AutoRunner一直以来在各种技术程序的自动化测试中起着重要的作用,应广大用户的要求,产品的功能点做了升级. 本次升级的最大特点在于提升浏览器的兼容性和C/S端程序的执行效率,优化视 ...

  8. 利用Visual Studio 2005的自动化测试工具来做数据导入

    * reference link: http://www.bentan.cn/Blog/Lists/Posts/Post.aspx?ID=3 1     引言 1.1         研究目标 在我们 ...

  9. C#借助API实现黑盒自动化测试工具的编写

    C#借助API实现黑盒自动化测试工具的编写 本文代码下载(VS2010开发):http://download.csdn.net/source/2796362 本文摘要: 1:一个简单的例子 1.1:E ...

最新文章

  1. 配置文件没有关闭保护模式_配置文件:PS自带的海量滤镜 | 照片调色宝典13
  2. mcgs组态软件中字体如果从左到右变化_昆仑通态专题(十一):MCGS嵌入式组态软件的脚本程序...
  3. 大数据学习笔记53:Flume Sink Processors(Flume接收器处理器)
  4. Bootstrap-基于jquery的bootstrap在线文本编辑器插件Summernote
  5. 开启弹窗_PC端广告弹窗拦截
  6. 有向无环图中的拓扑排序
  7. 机器学习代码实战——线性回归(多变量)(Linear Regression)
  8. 遇到的bug及解决方法,持续更新
  9. 「14」支持向量机——我话说完,谁支持?谁反对?
  10. vs2019中git提交代码的步骤
  11. 华为HCIP(HCNP)笔记,还不快快收藏!
  12. 悬崖帝国中文版下载|悬崖帝国中文破解版下载 v1.0绿色免安装版
  13. html改excel,怎么把html文件转成excel:html表格如何转换excel
  14. [译] 为什么加密货币泡沫会破裂?
  15. 出席华盛顿大学以人为本用户体验设计领导力活动 探讨区块链的用户体验 | ArcBlock 活动...
  16. Android EventBus的实现原理
  17. Oracle设计题资料分析题
  18. 如何保障业务0暂停下,从11gR2 MAA升级到12c?
  19. 技术人员升级打怪的方法论
  20. Tekton之三:快速理解 Tekton 是如何工作的

热门文章

  1. VUE解决微信签名,SPA微信invalid signature问题,完美处理
  2. 数据库内核月报 - 2017年12月
  3. js 使用 Lawnchair 存储 json 对象到本地
  4. 活动目录在构建核心过程中的八个关键点(下)
  5. 【原】Java学习笔记020 - 面向对象
  6. PgSQL · 实战经验 · 如何预测Freeze IO风暴
  7. echo向文件中写入
  8. centos安装easy_instal
  9. 转《刘润的数字化家庭》
  10. AjaxControlToolKit之DragPanelExtender用法