防止删库悲剧发生,这里有个Bash脚本测试框架,危险代码一测便知
本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处。
想要清理文件夹内部分冗余文件,结果误删了同事刚合的代码?
(例如,在rm -rf /usr/bin/test的/usr后面加了个空格,结果删掉了整个/usr文件)
相比于其他语言,Bash自带许多令人摸不着头脑的设计,其中之一就是变量中间不能加空格。这就导致Bash在调试时,某些命令具有危险性,例如rm -rf是删除文件夹下所有文件,一旦执行错误,可能会产生爆炸的效果。
现在,手残党的福音来了:GitHub上有一位朋友推出了一款Bash命令的测试框架Bach,助你检测脚本里有没有危险的成分。
![防止删库悲剧发生,这里有个Bash脚本测试框架,危险代码一测便知](https://s4.51cto.com/oss/202007/20/b71744bb6d39a0b2b8c46ada68c6eee2.jpeg)
据开发者介绍,这款框架能让你心情平静
只要在测试脚本中导入这款Bach框架,就相当于服下了一剂后悔药,能让你赶紧改掉手残写错的代码提前测试Bash脚本的行为。
这样,便能防止Bash的危险命令执行了错误的参数,从而带来的灾难性后果。
下图是Bach框架中提供的一个名为 @do-not-panic 的 API,将它直接放进含有危险命令的测试方法后,可以避免出现不小心调用的情况。
![防止删库悲剧发生,这里有个Bash脚本测试框架,危险代码一测便知](https://s4.51cto.com/oss/202007/20/d4fefae575ed6d8c5c8c489d6e325476.jpeg)
有用户指出,这个API的名字非常友好
看起来再也不用删库跑路了。
使用方法也很简单,只需要掌握几个测试实例,就能轻松上手使用这款测试框架。(文末附框架代码)
Bach测试方法
这款测试框架的优势在于,它真的非常小(50kB左右),下载后只要在编写脚本测试前,用source命令导入一下Bach框架中的bach.sh,就能直接使用。
下图是测试含rm -rf这样的危险命令的样例。
图中可见,我们将需要执行的代码部分写在以test-开头的方法中,Bach则会自动寻找与这个测试方法对应的-assert结尾的验证。
![防止删库悲剧发生,这里有个Bash脚本测试框架,危险代码一测便知](https://s4.51cto.com/oss/202007/20/bfc1f1f0599710f201876c147b0a42ef.jpeg)
图中是手残的范例,变量抄都抄错了
也就是说,Bach运行两个方法时,会验证两个方法中执行的命令及其参数是否一致(图中显然不一致),如果不一致,测试结果便会失败。
了解了测试脚本的方法,来看看怎么写模拟命令。
用Bach模拟/直接调用命令
在Bach测试框架中,所提供的API都是以@开头的。
其中,有一部分命令可以被模拟(Mock API),另外,如果不得不在测试时直接调用部分命令,Bach中也提供了直接执行这些命令的API。
鉴于command和xargs命令的特殊性,Bach很特别地为这两个命令做了模拟。
在网页的测试说明中,会对这些API进行统一说明。
![防止删库悲剧发生,这里有个Bash脚本测试框架,危险代码一测便知](https://s3.51cto.com/oss/202007/20/b3128a8f6850bccd483fbc2aa31d000f.jpeg)
API调用说明范例
简单了解后,也许有用户会问,就Unix遗留的某些值得吐槽的设计Bash本身特性而言,已经有不少测试的框架了,Bach到底特殊在哪里?
Bach测试原理
事实上,Bach最特别的地方,在于这是一个真正的Bash单元测试框架。
也就是说,Bach可以用于测试Bash中一些非常危险的命令,且不用担心会产生任何后果。
毕竟在Bach中,没有任何在PATH中的命令会被执行,除非明确地指定了路径。
Bach验证的是命令的调用,而非命令的结果,毕竟对于Shell脚本来说,最重要的是验证命令的调用是否传入了期望的参数或选项。
这款Bach测试框架与目前其他部分测试框架(如Bats、Shunit2等)的区别在于,后者实际上都会调用系统PATH中的命令,然而Bach是绝对安全的。
所以,即使是初学者,也可以安心地用Bach去练习Bash编程,且不用担心任何误操作。
![防止删库悲剧发生,这里有个Bash脚本测试框架,危险代码一测便知](https://s5.51cto.com/oss/202007/20/cc131ecf845d6d70c4bd30f4d6aa5fb5.jpeg)
网页内的代码有非常友好详细的注释
听起来简直就像是为Bash设计的完美补丁。
当然,目前Bach依旧有所限制,例如它不能阻止直接使用绝对路径的命令调用,也无法无法阻止 I/O 重定向等。
但这款测试框架依旧在不断地更新,目前正在被宝马集团和华为使用。
感兴趣的小伙伴,可以期待一下它的后续,或是一同成为Bach框架的代码贡献者。
作者介绍
柴锋,一位有着15年码龄的软件开发工程师,熟悉Unix/Linux系统、IT运维、自动化测试和持续交付。
传送门
Bach测试框架地址https://github.com/bach-sh/bach/blob/master/README-cn.md
测试实例https://github.com/bach-sh/bach/blob/master/tests/bach-testing-framework.test.sh
相关文章
- 金融服务领域的大数据:即时分析
- 影响大数据、机器学习和人工智能未来发展的8个因素
- 从0开始构建一个属于你自己的PHP框架
- 如何将Hadoop集成到工作流程中?这6个优秀实践必看
- SEO公司使用大数据优化其模型的5种方法
- 关于Web Workers你需要了解的七件事
- 深入理解HTTPS原理、过程与实践
- 增强分析:数据和分析的未来
- PHP协程实现过程详解
- AI专家:大数据知识图谱——实战经验总结
- 关于PHP的错误机制总结
- 利用数据分析量化协同过滤算法的两大常见难题
- 怎么做大数据工作流调度系统?大厂架构师一语点破!
- 2019大数据处理必备的十大工具,从Linux到架构师必修
- OpenCV中的KMeans算法介绍与应用
- 教大家如果搭建一套phpstorm+wamp+xdebug调试PHP的环境
- CentOS下三种PHP拓展安装方法
- Go语言HTTP Server源码分析
- Go语言HTTP Server源码分析
- 2017年4月编程语言排行榜:Hack首次进入前五十