使用makefile创建单元测试

ant*_*009 0 c unit-testing makefile

gcc 4.7.2
c89
Run Code Online (Sandbox Code Playgroud)

你好,

我想知道是否有任何人知道任何教程或教科书,涵盖使用makefile为我的c程序创建一些简单的单元测试.

我想运行一些自动化测试,创建一个测试套件并将其添加到我的Makefile中.

只想了解如何开始的一些想法.

非常感谢任何建议

Tim*_*ies 9

确实如此,少于30行的 可以构建一个通用的单元测试引擎.

请注意,我编写了以下内容来测试脚本,但它可以很容易地为定制.实际上,恕我直言,整个事情是脚本功能的一个很好的例子.

首先,您将所有测试都放在一些可执行文件中$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中的通用单元工具.分享和享受.