ant*_*009 0 c unit-testing makefile
gcc 4.7.2
c89
Run Code Online (Sandbox Code Playgroud)
你好,
我想知道是否有任何人知道任何教程或教科书,涵盖使用makefile为我的c程序创建一些简单的单元测试.
我想运行一些自动化测试,创建一个测试套件并将其添加到我的Makefile中.
只想了解如何开始的一些想法.
非常感谢任何建议
确实如此,少于30行的 makefile可以构建一个通用的单元测试引擎.
请注意,我编写了以下内容来测试gawk和lisp脚本,但它可以很容易地为c定制.实际上,恕我直言,整个事情是shell脚本功能的一个很好的例子.
首先,您将所有测试都放在一些可执行文件中$Testdir.在此示例中,所有测试都有文件名001 002等(没有扩展名).
接下来,您需要一些设置内容:
Here=$(PWD)
Testdir=$(Here)/eg
ready: $(Testdir) $(Tmp)
$(Tmp) :
@ - [ ! -d $(Tmp) ] && mkdir $(Tmp)
Run Code Online (Sandbox Code Playgroud)
然后,您需要将所有测试收集到一个名为的列表中 $Tests
Tests:=$(shell cd $(Testdir); ls | egrep '^[0-9]+$$' | sort -n )
Run Code Online (Sandbox Code Playgroud)
(注意使用:=.这是一个构建$Tests一次的轻微优化,并且多次使用它.)
$(X)我的列表中的每个文件都$Tests可以通过两种方式执行.首先,你可以run做到.其次,您可以运行它并将cache结果输入$(X).want.
run : ready $(Testdir)/$(X)
@echo $X 2>&1
@cat $(Testdir)/$(X) | $(Run)
cache : ready
@$(MAKE) run | tee $(Testdir)/$X.want
@echo new test result cached to $(Testdir)/$X.want
Run Code Online (Sandbox Code Playgroud)
cache一旦测试准备就绪并产生正确的输出,我就是测试结果.
实际执行由一个名为的魔术变量定义$(Run).这是您必须专门为正在测试的语言编写的内容.为了记录,我正在测试Gawk脚本,所以我的$(Run)内容如下(你可以将它改为你需要的任何东西).
Run= gawk -f mycode.awk
Run Code Online (Sandbox Code Playgroud)
一旦完成,然后运行一个测试,我只是将运行后得到的内容$(X)与缓存副本进行比较:
test : ready $(Testdir)/$(X).want
@$(MAKE) run > $(Tmp)/$X.got
@if diff -s $(Tmp)/$X.got $(Testdir)/$X.want > /dev/null; \
then echo PASSED $X ; \
else echo FAILED $X, got $(Tmp)/$X.got; \
fi
Run Code Online (Sandbox Code Playgroud)
这就是我运行所有测试的方式:
tests:; @$(foreach x, $(Tests), $(MAKE) X=$x test;)
Run Code Online (Sandbox Code Playgroud)
您还可以对所有当前输出执行批量缓存(警告:除非您的测试当前正在生成正确的输出,否则不要这样做):
cache :
@$(foreach x, $(Tests), $(MAKE) X=$x cache;)
Run Code Online (Sandbox Code Playgroud)
最后,如果你愿意,你也可以得到PASSEDs和FAILEDs的最终得分:
score :
@$(MAKE) tests | cut -d\ -f 1 | egrep '(PASSED|FAILED)' | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)
就是这样:正如所承诺的那样 - 在30行以下的Make中的通用单元工具.分享和享受.