华为使用的bash脚本, 防止删库悲剧发生!

Posted 程序员大咖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为使用的bash脚本, 防止删库悲剧发生!相关的知识,希望对你有一定的参考价值。

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇

Bach 是一个 Bash 脚本测试框架,可以用来测试包含了类似 rm -rf / 这样危险命令的脚本,不会给你惊喜,不会让你感到痛苦。

Bach 入门

Bach 作为一个真正的单元测试框架,意味着任何在 PATH 环境变量中的命令都成为了被测的 Bash 脚本的外部依赖,这些外部命令都不会被真正的执行。换句话说,在 Bach 的测试中,除了部分的内置命令外,所有的命令都是 "Dry Run" 的。所以,在 Bach 中,验证的是命令被执行的时候是否使用了期望的参数,而非验证命令的执行结果。毕竟,我们测试的是 Bash 脚本的行为,而非测试那些命令是否可以正常工作。Bach 也提供了一系列的 API 可以用于模拟命令的执行。

安装 Bach

Bach 的安装很简单,只需要下载 bach.sh 到你的项目中,在测试脚本中用 source 命令导入 Bach 框架的 bach.sh 即可。

比如:

source path/to/bach.sh

一个简单的测试示例

#!/usr/bin/env bash
set -euo pipefail
source bach.sh

test-rm-rf() 
    # Bach 的标准测试用例是由两个方法组成
    #   - test-rm-rf
    #   - test-rm-rf-assert
    # 这个方法 `test-rm-rf` 是测试用例的执行

    project_log_path=/tmp/project/logs
    sudo rm -rf "$project_log_ptah/" # 注意,这里有个笔误!

test-rm-rf-assert() 
    # 这个方法 `test-rm-rf-assert` 是测试用例的验证
    sudo rm -rf /   # 这就是真实的将会执行的命令
                    # 不要慌!使用 Bach 测试框架不会让这个命令真的执行!


test-rm-your-dot-git() 
    # 模拟 `find` 命令来查找你的主目录下的所有 `.git` 目录,假设会找到两个目录

    @mock find ~ -type d -name .git === @stdout ~/src/your-awesome-project/.git \\
                                                ~/src/code/.git

    # 开始执行!删除你的主目录下的所有 `.git` 目录!
    find ~ -type d -name .git | xargs -- rm -rf

test-rm-your-dot-git-assert() 
    # 验证在 `test-rm-your-dot-git` 这个测试执行方法中最终是否会执行以下这个命令。

    rm -rf ~/src/your-awesome-project/.git ~/src/code/.git

更多的测试示例请看 tests/bach-testing-framework.test.sh

用 Bach 来写脚本测试

与我们所熟悉的测试框架不同的是,Bach 的标准测试用例是由两个方法组成,这样做的目的是为了让测试用例的验证变得简单。测试用例的执行部分是写在以 test- 开头的方法中,然后 Bach 会寻找与这个测试方法名称对应的以 -assert 结尾的测试验证方法。所以,每一个 Bach 的测试执行方法都必须不能以 -assert 作为后缀。比如,一个名为 test-rm-rf 的测试执行方法,对应的测试验证方法是 test-rm-rf-assert

例子:

source bach.sh

test-rm-rf() 
    project_log_path=/tmp/project/logs
    sudo rm -rf "$project_log_ptah/" # 这里写错了变量名,Bash 默认让变量变成空字符串,这可能是个严重的问题!

test-rm-rf-assert() 
    sudo rm -rf /

Bach 会分别运行两个方法,去验证两个方法中执行的命令及其参数是否是一致的。第一个方法 test-rm-rf 是 Bach 的测试用例的执行,与之对应的测试验证方法就是 test-rm-rf-assert 这个方法

如果 Bach 没有找到某个测试用例的测试验证方法,Bach 会尝试用传统的一个测试方法的形式。在这种方式下,测试执行方法里面必须要有断言 API 的调用,否则改测试一定会失败。

例子:

test-single-function-style() 
    declare i=2
    @assert-equals 4 "$((i*2))"

Bach 的断言 API 有:

  • @assert-equals

  • @assert-fail

  • @assert-success

如果 Bach 没有找到对应的测试验证方法,同时在测试执行方法里面也没有断言的调用,这个测试用例就一定是失败的。

如果一个测试用例的方法名称是以 test-ASSERT-FAIL 开头,则意味着反转这个测试用例的执行结果。也就是说,如果测试验证成功,反而结果是失败的。如果测试验证失败,则结果是成功的。

项目地址

网站: https://bach.sh
代码: https://github.com/bach-sh/bach

-End-

最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!

点击👆卡片,关注后回复【面试题】即可获取

在看点这里好文分享给更多人↓↓

以上是关于华为使用的bash脚本, 防止删库悲剧发生!的主要内容,如果未能解决你的问题,请参考以下文章

写了Bug,误执行 rm -fr /*,我删删删删库了,要跑路吗?

在 Bash 脚本中,如果发生某种情况,如何退出整个脚本?

linux arm 运行 shell .sh 脚本文件报错:/bin/bash^M: bad interpreter: No such file or directory(dos2unix )(代码片

如何防止 NPM 自定义参数中的斜线扩展?

postgresql如何防止删库

面试题24