15.测试套件的支持
测试套件由一系列的测试用例组成。
Automake可以生成代码来处理两种测试套件。
- 基于和
dejagnu
框架集成。 - 基于通用测试脚本,通过定义特殊变量
TESTS
激活。好像不支持通配符。
第二种允许并发执行测试脚本,使用已有的测试协议(例如TAP),以及自定义测试驱动程序和测试运行程序。
在任何情况下,通过make check
调用测试套件。
一些说明:
跳过测试(skipped):测试没有意义,测试条件不满足。
硬错误(hard error):测试场景不对,一些意外情况。
预期失败expected failure (xfail),未预计的通过unexpected pass (xpass)。
15.2 简单测试¶
15.2.1 基于脚本的测试套件¶
如果TESTS
变量被定义了,其值是执行测试的程序或脚本列表。
测试脚本可以并行或串行执行,默认的是并行测试套件。 默认的测试结果是测试脚本的退出结果。
Automake也支持更多的协议:standard (see Using the TAP test protocol) 和 custom (see Custom Test Drivers)。
note:不能在串行中使用这些协议。
不使用测试协议的时候,测试脚本的退出码的意义如下:
- 0 - 成功
- 77 - 跳过该测试
- 99 - 硬错误
- 其它 - 失败
可以使用XFAIL_TESTS
变量列出xfail的测试,它是TESTS
的子集。定义DISABLE_HARD_ERRORS
变量为非空值来项普通的错误一样对待硬错误。
note:使用测试协议的时候,这两个变量不会起作用。
PASS: foo.sh
PASS: zardoz.tap 1 - Daemon started
PASS: zardoz.tap 2 - Daemon responding
SKIP: zardoz.tap 3 - Daemon uses /proc # SKIP /proc is not mounted
PASS: zardoz.tap 4 - Daemon stopped
SKIP: bar.sh
PASS: mu.tap 1
XFAIL: mu.tap 2 # TODO frobnication not yet implemented
AM_COLOR_TESTS=always
,彩色输出。
AM_TESTS_ENVIRONMENT
与 TESTS_ENVIRONMENT
变量用于给测试脚本运行初始化代码和设置环境变量。前者是开发人员保留的,后者是用户保留的(可扩展并且覆盖前者的设置)。非空的AM_TESTS_ENVIRONMENT
必须以分号结束,且不支持串行测试。
Automake会保证每个在TEST
中列出的文件在运行之前被构建。
在check_primary
中列出的测试程序之在make check
的时候构建,而不是在make all
期间。
15.2.2 串行测试¶
强烈不推荐使用。
通过Automake选项serial-tests实现串行测试
15.2.3 并行测试¶
make -j执行并行测试。
make -j3 check
标准错误与标准输出重定向到每个测试的.log
文件,结果在.trs
文件。失败的测试收集在test-suite.log文件中。
自定义测试程序;没有注册的扩展名的测试,会使用变量LOG_COMPILER, AM_LOG_FLAGS, and LOG_FLAGS
:
TESTS = foo.pl bar.py baz
TEST_EXTENSIONS = .pl .py
PL_LOG_COMPILER = $(PERL)
AM_PL_LOG_FLAGS = -w
PY_LOG_COMPILER = $(PYTHON)
AM_PY_LOG_FLAGS = -v
LOG_COMPILER = ./wrapper-script
AM_LOG_FLAGS = -d
可以使用:
来保证测试的依赖关系
TESTS = foo-compile.test foo-execute.test
foo-execute.log: foo-compile.log
note:只保证顺序,不保证结果。即无论foo-compile.test是否成功,都会继续执行foo-execute.log。
15.3 自定义测试驱动程序¶
15.3.1 概述¶
自定义的测试程序的预期是:正确地运行传递给它的测试程序(包括命令行传递给测试程序的参数),分析它们的执行和结果,创建相关的.log
和.trs
文件,在控制台显示测试结果。
如何确定和分析测试脚本结果的确切细节由各个驱动程序决定。
即使使用自定义的测试驱动程序,并行测试的大部分功能仍然要实现;包括以下几点:
- 在
TESTS
中定义测试脚本,并在运行时可通过TESTS
或TEST_LOGS
覆盖。 - 通过使用make的选项-jN,并发执行。
- 每个测试的
.log
、.trs
文件,还有摘要的.log
文件。 recheck
目标,RECHECK_LOGS
变量,测试懒重新运行。- 测试间的依赖关系。
- 对
check_*
变量的支持(check_PROGRAMS, check_LIBRARIES, ...)。 - 使用
VERBOSE
环境变量获取测试套件失败的详细输出。 - 定义
TESTS_ENVIRONMENT, AM_TESTS_ENVIRONMENT and AM_TESTS_FD_REDIRECT
变量。 - 通用定义和扩展定义
LOG_COMPILER
和LOG_FLAGS
变量。
15.3.2 声明驱动¶
通过定义make变量LOG_DRIVER
或ext_LOG_DRIVER
(ext必须在TEST_EXTENSIONS
中声明)来声明自定义的测试套件驱动。
开发者保留变量AM_DRIVER_FLAGS
和用户保留变量LOG_DRIVER_FLAGS
可被用于定义flags,会被传给每个LOG_DRIVER
调用。类似的,对于每个在TEST_EXTENSIONS
中声明的扩展ext,在AM_ext_LOG_DRIVER_FLAGS
和ext_LOG_DRIVER_FLAGS
中列出的flags会被传递给ext_LOG_DRIVER
。
15.3.3 定制测试驱动的 API¶
pass
15.4 TAP 测试协议¶
15.4.1 介绍¶
TAP, the Test Anything Protocol,是一个简单的基于文本的在测试模块(或程序)与测试工具之间的接口。 The tests (TAP producers) 向标准输出中以一种简单的格式写入测试结果; a test harness (TAP consumer)会解析和解释这些结果,正确地呈现给用户,并且/或者为稍后的分析注册结果。
15.4.2 结合Automake测试工具使用¶
目前Automake附带的TAP驱动程序需要一些手动配置。必须从Automake的发行版中获取tap-driver.sh
脚本,复制到源码目录,然后使用Automake支持的第三方测试驱动来指导工具俩使用该脚本和AM_INIT_AUTOMAKE
发现的awk程序来运行自己的TAP-producing测试。
除了通用的Automake测试驱动选项,tap-driver.sh
还支持以下选项:
- --ignore-exit 忽视测试脚本的退出状态;默认情况下,如果脚本以非零状态退出,驱动会报告一个错误。
- --comments 指示测试驱动程序在测试套件的输出也显示TAP注释(即以
#
开头的行)。默认情况下,注释只会复制到.log
文件。 - --no-comments
- --merge 指示测试驱动合并测试脚本的标准错误到他们的标准输出。如果你想保证测试脚本中的注释与测试结果一起显示,该选项是必须的。
- --no-merge
- --diagnostic-string=STRING 改变注释的符号:
#
->STRING
。非TAP官方标准。