bash - 如何重用 bats 单元测试
问题描述
我期待在不同环境中重用代码进行 bats 单元测试。我想知道是否可以在一个地方为两个文件提供通用的@test 代码。
我的第一个单元测试文件将在我的开发环境中运行:
#!/usr/bin/env bats
load 'test_helper/bats-support/load'
load 'test_helper/bats-assert/load'
setup() {
# Development environment
PROJECT_PATH="/d/develop/myproject"
}
@test 'check project path' {
cd $PROJECT_PATH
run git fetch origin
refute_output --partial 'fatal: not a git repository (or any of the parent directories): .git'
}
我的第二个单元测试文件运行相同的测试,将在部署或生产环境中运行:
#!/usr/bin/env bats
load 'test_helper/bats-support/load'
load 'test_helper/bats-assert/load'
setup() {
# Production environment
PROJECT_PATH="/var/myproject"
}
@test 'check project path' {
cd $PROJECT_PATH
run git fetch origin
refute_output --partial 'fatal: not a git repository (or any of the parent directories): .git'
}
如您所见,测试代码是相同的,仅更改$PROJECT_PATH
设置函数的值。
感谢您花时间阅读这个问题。
解决方案
有几种方法可以解决这个问题:
- 只需删除该
setup
功能并设置在测试PROJECT_PATH
之外。 - 设置一个合理的默认值(并在开发中覆盖它)。
- 使
PROJECT_PATH
变量成为必需的(如果未设置则使测试失败)。 - 如果更多测试需要特定于环境的设置,
ENVIRONMENT
请在测试之外设置并PROJECT_PATH
根据ENVIRONMENT
.
(请注意,仅setup
需要更改函数, check project path
@test 函数保持原样)
由于谈话很便宜,代码胜于雄辩,这里有一些例子来说明我对这些选项的意思:
选项 1. 设置在测试PROJECT_PATH
之外
在调用 BATS 之前完全删除setup
并设置:PROJECT_PATH
export PROJECT_PATH="/var/myproject"
bats ./my_test.bats
选项 2. 设置合理的默认值
将生产值设置为默认值并允许从测试外部进行设置:
setup() {
PROJECT_PATH="${PROJECT_PATH:-/var/myproject}"
}
选项 3.PROJECT_PATH
必填
PROJECT_PATH
如果尚未设置,要中止测试并使其失败,请将当前设置替换为:
setup() {
if [[ ! -v "${PROJECT_PATH}" ]]; then
skip 'Required environment variable "$PROJECT_PATH" not set!'
return 1
fi
}
选项 4. 使用ENVIRONMENT
PROJECT_PATH
而不是直接依赖,$ENVIRONMENT
在调用 BATS 时设置一个并PROJECT_PATH
基于该设置:
setup() {
if [[ "${ENVIRONMENT}" == 'development' ]];then
PROJECT_PATH="/d/develop/myproject"
elif [[ "${ENVIRONMENT}" == 'production' ]];then
PROJECT_PATH="/var/myproject"
else
skip "Unknow \$ENVIRONMENT: '${ENVIRONMENT}'"
return 1
fi
}
结论
哪种解决方案最好取决于您想要的设置。当然,这些解决方案之间的交叉也是可能的。我将把它作为练习留给读者......
推荐阅读
- python - 轮流追加列表值python
- mysql - 从不同的mysql表中输入数据
- javascript - NodeJS Mongoose:捕获 CRUD 错误并将自定义消息发送回客户端
- .net - 如何测试接受 Protobuf 作为请求主体的 API 控制器
- c++ - 返回限制数字(例如 INT_MAX)表示假总是安全的吗?
- symfony - Symfony 我的调试工具栏不再出现在我的网站上
- reactjs - TextInput ref 不起作用——得到 ReferenceError: Can't find variable
- python - 从命名空间中的包中检查模块
- python - Python tkinter 更新函数冻结主函数
- gearman - 如何在 sakuli_gearman_proxy.cfg 中配置修改 sakuli 输出的规则?