通过 bats 测试特定目录及其内容的创建

Test creation of specific directory and its contents via bats

我正在调用我创建的交互式 cli 工具(使用 go 但这不在问题的范围内)。

我正在使用 BATSexpect 的组合对其进行集成测试。

这里是具体的测试套件:

@test "Running interactive test - providing clone directory parameter" {
    cd test_expect
    eval "./basic_interactive.exp"
}

这一步的成功是创建了一个包含预定义内容的特定目录。

因为我是 BATS 的新手,所以我无法找到一种方法来断言命令

ls -1 /path/to/directory/that/is/supposed/to/be/created

等于

file1
file2
file3

等等

有什么建议吗?

我试过了

@test "Running interactive test - providing clone directory parameter" {
    cd test_expect
    eval "./basic_interactive.exp"
    eval "ls -1 path/to/directory/that/is/supposed/to/be/created"
    echo $output
}

但它不打印任何东西。

如果我对你的问题的理解正确,你基本上想要运行一个命令并验证输出,对吗?

引用自the BATS manual

Bats includes a run helper that invokes its arguments as a command, saves the exit status and output into special global variables

BATS 测试方法中可用于验证输出的两个变量是:

  • $output,其中包含命令的标准输出标准错误流的组合内容

  • $lines 数组,用于轻松访问输出的各个行

将此应用到您的示例中会得到:

@test "Running interactive test - providing clone directory parameter" {
    cd test_expect
    ./basic_interactive.exp

    run ls -1 path/to/directory/that/is/supposed/to/be/created

    expected=$(cat <<-TXT
file1
file2
file3
TXT
)

    [ "${output}" = "${expected}" ]
}

如果您发现自己更频繁地使用 BATS(或用于更复杂的测试),您可能会考虑使用专用断言库(如 bats-assert)让您的生活更轻松。

(特别是 assert_output 命令值得研究,因为它支持文字、部分和正则表达式匹配)。

要了解为什么看不到任何输出,您需要阅读 the section in the manual titled "Printing to the terminal"。简而言之,它归结为仅在重定向到文件描述符 3 时才显示输出:

@test "test with output to terminal" {
    echo "# This will show up when you run the test" >&3
}