首页 > 解决方案 > 如何重用 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设置函数的值。

感谢您花时间阅读这个问题。

标签: bashunit-testingbats-core

解决方案


有几种方法可以解决这个问题:

  1. 只需删除该setup功能并设置在测试PROJECT_PATH 之外。
  2. 设置一个合理的默认值(并在开发中覆盖它)。
  3. 使PROJECT_PATH变量成为必需的(如果未设置则使测试失败)。
  4. 如果更多测试需要特定于环境的设置,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
}

结论

哪种解决方案最好取决于您想要的设置。当然,这些解决方案之间的交叉也是可能的。我将把它作为练习留给读者......


推荐阅读