在 bash 中测试程序

ant*_*npp 5 bash

我用 C++ 编写了一个程序,现在我有了一个二进制文件。我还生成了一堆用于测试的测试。现在我想用 bash 自动化测试过程。我想在我的二进制文件的一次执行中保存三件事:

  1. 执行时间处理时间
  2. 退出代码
  3. 程序的输出

现在我正在使用一个脚本,该脚本只测试二进制文件是否完成其工作并返回 0,并且不保存我上面提到的任何信息。我的脚本看起来像这样

#!/bin/bash

if [ "$#" -ne 2 ]; then
    echo "Usage: testScript <binary> <dir_with_tests>"
    exit 1
fi

binary="$1"
testsDir="$2"

for test in $(find $testsDir -name '*.txt'); do
    testname=$(basename $test)

    encodedTmp=$(mktemp /tmp/encoded_$testname)
    decodedTmp=$(mktemp /tmp/decoded_$testname)

    printf 'testing on %s...\n' "$testname"

    if ! "$binary" -c -f $test -o $encodedTmp > /dev/null; then
        echo 'encoder failed'
        rm "$encodedTmp"
        rm "$decodedTmp"
        continue
    fi

    if ! "$binary" -u -f $encodedTmp -o $decodedTmp > /dev/null; then
        echo 'decoder failed'
        rm "$encodedTmp"
        rm "$decodedTmp"
        continue
    fi

    if ! diff "$test" "$decodedTmp" > /dev/null ; then
        echo "result differs with input"
    else
        echo "$testname passed"
    fi

    rm "$encodedTmp"
    rm "$decodedTmp"
done
Run Code Online (Sandbox Code Playgroud)

我想将输出保存$binary在变量中而不是将其发送到/dev/null. 我也想使用timebash 功能节省时间

Ant*_*ica 1

当您要求将输出保存在 shell 变量中时,我尝试在不使用输出重定向 \xe2\x80\x93 的情况下回答这个问题,它将输出保存在(临时)文本文件中(然后必须对其进行清理)。

\n\n

保存命令输出

\n\n

你可以替换这一行

\n\n
if ! "$binary" -c -f $test -o $encodedTmp > /dev/null; then\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
if ! output=$("$binary" -c -f $test -o $encodedTmp); then\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用命令替换将程序输出保存$binary在 shell 变量中。命令替换(与 shell 变量赋值相结合)还允许将程序的退出代码传递到调用 shell,以便条件if语句将继续检查是否$binary执行时没有错误。

\n\n

您可以通过运行来查看程序输出echo "$output"

\n\n

节省时间

\n\n

如果没有更复杂的进程间通信形式,则作为另一个 shell 的子进程的 shell 无法更改其父进程的变量或环境,因此我可以节省时间和程序输出的唯一方法是将它们组合在一个变量中:

\n\n
if ! time-output=$(time "$binary" -c -f $test -o $encodedTmp) 2>&1); then\n
Run Code Online (Sandbox Code Playgroud)\n\n

由于time将其分析信息打印到,因此我使用括号运算符在可以重定向到 的stderr子 shell 中运行命令。可以通过运行查看编程输出和时间输出,它应该返回类似以下内容的内容:stderrstdoutecho "$time-output"

\n\n
<program output>\n<blank line>\nreal    0m0.041s\nuser    0m0.000s\nsys     0m0.046s\n
Run Code Online (Sandbox Code Playgroud)\n