使用动态内容进行 bash 单元测试



我不得不在一个非常旧的awk脚本上实现一些新功能,现在想要实现一些单元测试来检查我的脚本是否破坏了东西。我使用 diff 来检查脚本输出是否与 whished 输出不同:

awk -f mygenerator.awk test.1.gen | diff - test.1.out -q
if [ $? -ne 0 ]; then
    echo "test failed"
fi

但是现在我有一些文件可以生成动态内容,例如生成日期的时间戳,这会导致 diff 失败,因为显然时间戳会有所不同。我的第一个方法是使用 grep 删除相应的行并测试两个"干净"文件。然后通过 egrep 检查该行是否为时间戳。

有没有更好的方法可以做到这一点?由于兼容性原因,这一切都应该由 bash 脚本中的常见 unix 工具完成。

您可以将sed与正则表达式一起使用。

如果输出类似于 date 命令中的Fri Feb 21 22:53:54 UTC 2014,请使用:

regex_timestamp="s/([A-Z]{1}[a-z]{2} [A-Z]{1}[a-z]{2} [0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2} [A-Z]{3} [0-9]{4})//g"; 
awk -f mygenerator.awk test.1.gen | diff <(sed -r "$regex_timestamp" -) <(sed -r "$regex_timestamp" test.1.out) -q

如果您尝试过滤 unix 时间戳,只需将其用作正则表达式:

s/([0-9]{10})//g

请注意,后者替换了与 unix 时间戳大小相同的任何一组数字。您的时间戳是什么格式?

我通常使用sed将时间戳替换为XXXXXX,因此我仍然可以在同一行上比较其他信息。

date | 
sed 's/(Sun|Mon|Tue|Wed|Thu|Fri|Sat) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)  ?[0-9]+ [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [A-Z]+ [0-9]{4}/XXXXXX/'

相关内容

  • 没有找到相关文章

最新更新