在bash中测试程序 我用C++编写了一个程序,现在我有一个二进制文件。我还生成了一系列用于测试的测试。现在我想用bash自动化测试过程。我想在一次二进制执行中保存三件事: 执行时间 出口代码 程序的输出
现在我正在编写一个脚本,它只测试二进制文件的工作,返回0,不保存我上面提到的任何信息。我的脚本是这样的在bash中测试程序 我用C++编写了一个程序,现在我有一个二进制文件。我还生成了一系列用于测试的测试。现在我想用bash自动化测试过程。我想在一次二进制执行中保存三件事: 执行时间 出口代码 程序的输出,bash,Bash,现在我正在编写一个脚本,它只测试二进制文件的工作,返回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
#!/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
#/bin/bash
如果[“$#”-ne 2];然后
echo“用法:testScript”
出口1
fi
binary=“$1”
testsDir=“$2”
对于$中的测试(查找$testsDir-name'*.txt');做
testname=$(basename$test)
encodedTmp=$(mktemp/tmp/encoded_u$testname)
decodedTmp=$(mktemp/tmp/decoded_u$testname)
printf“在%s上测试…”。\n“$testname”
如果!“$binary”-c-f$test-o$encodedTmp>/dev/null;然后
回显“编码器失败”
rm“$encodedTmp”
rm“$decodedTmp”
持续
fi
如果!“$binary”-u-f$encodedTmp-o$decodedTmp>/dev/null;然后
回声“解码器失败”
rm“$encodedTmp”
rm“$decodedTmp”
持续
fi
如果!diff“$test”“$decodedTmp”>/dev/null;然后
echo“结果与输入不同”
其他的
echo“$testname已传递”
fi
rm“$encodedTmp”
rm“$decodedTmp”
完成
我希望将
$binary
的输出保存在变量中,而不是将其发送到/dev/null
中。我还想使用time
bash函数来节省时间您可以使用$?
在bash中获取进程状态,并通过echo$?
将其打印出来。
为了抓住时间的输出,你可以用这样的东西
{ time sleep 1 ; } 2> time.txt
或者您可以一次保存程序的输出和执行时间
(time ls) > out.file 2>&1
可以使用输出重定向将输出保存到文件。只需先更改
/dev/null
行:
if ! "$binary" -c -f $test -o $encodedTmp > /dev/null; then
到
然后分别更改第二行和第三行/dev/null:
if ! "$binary" -u -f $encodedTmp -o $decodedTmp >> prog_output; then
if ! diff "$test" "$decodedTmp" >> prog_output; then
测量程序的执行情况
start=$(日期+%s)
在第一行
然后
最后。当您要求将输出保存在shell变量中时,我尝试在不使用输出重定向的情况下回答这个问题,输出重定向将输出保存在(临时)文本文件中(然后必须清理) 保存命令输出 你可以换这条线
if ! "$binary" -c -f $test -o $encodedTmp > /dev/null; then
与
使用命令替换将$binary
的程序输出保存在shell变量中。命令替换(与shell变量赋值相结合)还允许将程序的退出代码传递给调用shell,因此有条件的if
语句将继续检查$binary
是否正确执行
您可以通过运行echo“$output”
查看程序输出
节省时间
如果没有更复杂的进程间通信形式,作为另一个shell的子进程的shell将无法更改其父进程的变量或环境,因此我可以节省时间和程序输出的唯一方法是将它们合并到一个变量中:
if ! time-output=$(time "$binary" -c -f $test -o $encodedTmp) 2>&1); then
由于time
将其评测信息打印到stderr
,因此我使用圆括号操作符在subshell中运行命令,其stderr
可以重定向到stdout
。可通过运行echo“$time output”
查看编程输出和时间输出,其应返回类似以下内容:
<program output>
<blank line>
real 0m0.041s
user 0m0.000s
sys 0m0.046s
实0.041s
用户0.000s
系统0m0.046s
或者,您可以使用time
命令测量执行持续时间。time实用程序用于汇总系统资源使用情况。Thx,这几乎正是我想要的。如果我能在单独的文件/变量中输出程序和时间信息,那就更好了。但无论如何,我可以这样处理它。@Anton不久前,我花了很长时间尝试做类似的事情,但在不创建临时文件的情况下,找不到其他方法。很高兴能帮忙。
if ! output=$("$binary" -c -f $test -o $encodedTmp); then
if ! time-output=$(time "$binary" -c -f $test -o $encodedTmp) 2>&1); then
<program output>
<blank line>
real 0m0.041s
user 0m0.000s
sys 0m0.046s