如何用shell脚本实现自动化测试的自动化?
摘要:一个文件监控引擎的自动化测试脚本,难倒我的不是如何编写测试用例和校验输出,而是 msys2 的 stdin 重定向和 console 程序的行缓冲设置…
前言
项目中有一个功能,需要监控本地文件系统的变更,例如文件的增、删、改名、文件数据变动等等。之前只在 windows 上有实现,采用的是 iocp + ReadDirectoryChanges 方案,现在随着整个应用移植到 mac 上,需要对这一部分进行适配,macOS 上相应的底层机制为 File System Events,通知的类型大同小异。为了便于验证,写了一个 demo 来跑最核心的功能。
macOS
开门见山,先来看在 mac 上的实现。
rdc-demo
这个 demo 是从 windows 迁移过来的,所以名称中仍保留了 ReadDirectoryChanges (rdc) 的痕迹。它接收一个目录路径作为监听目录,在该目录下的操作会触发系统通知从而打印相关日志。例如在监控目录输入下面的命令:
$ cd /var/tmp/rdc
$ touch a-file
$ echo abc > a-file
$ mv a-file b-file
$ rm b-file
$ mkdir a-dir
$ touch a-dir/c-file
$ mv a-dir b-dir
$ mv b-dir/c-file ./d-file
$ rmdir b-dir
$ mv d-file ../
会生成如下的 console 输出:
$ ./rdc-demo /var/tmp/rdc
dir: /var/tmp/rdc
create worker thread 0x16f207000
start monitoring...
add file: /private/var/tmp/rdc/a-file
add file: /private/var/tmp/rdc/a-file
modify file: /private/var/tmp/rdc/a-file
remove file: /private/var/tmp/rdc/a-file
add file: /private/var/tmp/rdc/b-file
find removed flag with renamed path, ignore..
remove file: /private/var/tmp/rdc/b-file
add dir: /private/var/tmp/rdc/a-dir
add file: /private/var/tmp/rdc/a-dir/c-file
remove dir: /private/var/tmp/rdc/a-dir
add dir: /private/var/tmp/rdc/b-dir
remove file: /private/var/tmp/rdc/b-dir/c-file
add file: /private/var/tmp/rdc/d-file
remove dir: /private/var/tmp/rdc/b-dir
remove file: /private/var/tmp/rdc/d-file
get char 10, errno 2
stop run loop
loop exit
stopping event stream...
end monitor
用户输入任意字符 (例如回车) 可以让 demo 退出监控。再来看监控目录中输入的命令,文件、目录的增删改都有涉及,应该说比较全面了。随着代码的不断完善,为保证不引入 bug,每次都需要执行上面一长串操作并对比着输出看,着实是一件费眼费力的事;随着考虑的场景增多 (例如将文件移到废纸篓、从监控目录外移入一个文件、文件大小写、软链接…),这个操作列表也在不断增长,如何提高测试效率成为一个摆在眼前的实际问题。于是自然而然的想:能不能用 shell 脚本自动化执行上述测试工作?通过运行一个脚本就把上面一系列操作执行完并给出最终测试结论就好了,于是有了下面的探索过程。
后台进程
一开始想法比较简单,就是在一个脚本中启动 demo,同时在监控目录中操作文件或目录,每个动作完成后,等待 demo 的输出,如果检测到对应的关键字 (例如 add / remove / rename / modify + file / dir),说明测试通过,否则测试不通过,最后打印通过与不通过的用例总数作为汇总。那么如何获取 demo 输出的内容呢?最直观的方案就是输出重定向啦,这个可以在启动 demo 时“做手脚”,因此先来看 demo 的启动部分。
启动 demo 和跑测试用例需要并行,因此有一个进程是运行在后台的。
