我正在尝试编写一个 shell 脚本来测试我的程序。我对此有一些基本问题:
目标:shell 脚本必须能够测试某些程序并确定它们是否通过了测试或未通过测试。
我的做法:这里我们需要处理两件事——>程序的输入和程序相应的输出。为了做到这一点,假设我们有 I/O 测试文件,例如:mytest.in 和 mytest.out 并使用它们进行测试
问题:我的障碍是 - 我们如何将 mytest.in 传递到程序(例如 program.c),即在这种情况下如何完成输入重定向。完成此操作后,我们如何获得输出并将其与 mytest.out 中的输出进行比较?
笔记:
-> 提供给文件的输入是通过 stdin 提供的,假设程序不通过命令行获取参数
-> 假设我们这样使用shell脚本:
./testscript tests folder program
如果您能举一个例子来证明这一点,那就太好了。
答案1
程序有一定的输入
- 命令行 (
"${inputArgs[@]}"
) - 标准输入
- (+可能:隐式输入文件、系统状态)
和某些输出
- 返回状态 (
$?
) - 标准输出
- 标准错误
- (+可能:隐式输出文件、系统状态更改)
括号内的输入和输出很难系统地测试。如果你可以避免这些,那么你的测试套件基本上应该这样做(不是字面上的):
./program "${inputArgs[@]}" < stdin.txt > stdout.txt 2>stderr.txt; status=$?
if [ "$status" -eq "$expectedStatus" ] && cmp stdout.txt expectedStdout.txt && cmp stderr.txt expectedStderr.txt; then
echo OK
else
[ ! $status -eq $expectedStatus ] && echo "Status $status != $expectedSattus"
diff stdout.txt expectedStdout.txt
diff stderr.txt expectedStderr.txt
fi