bash单元测试与动态内容

时间:2014-02-21 20:05:32

标签: bash unit-testing

我必须在一个非常古老的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工具完成。

2 个答案:

答案 0 :(得分:0)

我通常使用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/'

答案 1 :(得分:0)

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

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

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时间戳相同大小的任何数字组。你的时间戳是什么格式?