2011-04-03 39 views
3

我想使用Makefile来运行单个测试文件或所有测试或覆盖报告的组合版本。如何使用Makefile结合unittest结果?

我是Makefiles的新手,所以我借用了一个并对其进行了调整。结果是here

问题是,make test将按顺序运行每个测试,并且很难看到哪些失败,当你有一堆并且屏幕滚动很多时。我喜欢每个人都使用一个独立的过程,所以他们不会互相干扰。

问题是:我可以仅使用Makefile将更好的结果组合起来,还是我需要单独的脚本?你知道Makefiles运行测试的一些很好的例子吗?

(我只想使用的Makefile +单元测试+覆盖范围,并没有其他的依赖)

+0

我很想在Python之外重新发布这个问题,因为没有好的全面解决方案。 – dbn 2012-11-30 09:00:33

+0

请包括Makefile的相关部分。 *这里*链接不给我一个Makefile。 – reinierpost 2017-02-24 10:17:22

回答

1

这里是一个快速的黑客,你可以插入到你的Makefile无需更改基础架构。

特殊变量$?包含最后一个命令的退出状态。使用它你可以检查每个测试的返回值。在下面的脚本中,我计算了失败的测试数量,并在运行结束时输出。如果一次测试失败,您也可以立即退出,这样您就不必向上滚动查看输出。

failed=0 \ 
for i in $(TESTS); \ 
do \ 
    echo $$i; \ 
    PYTHONPATH=$(GAEPATH):. $(PYTHON) -m tests.`basename $$i .py` $(FLAGS); \ 
    if [ $? -ne 0 ] \ 
    then \ 
    $failed=$(($failed+1)) \ 
    fi \ 
done \ 
if [$failed -ne 0] \ 
then \ 
    echo $failed Tests Failed \ 
    exit $failed \ 
fi \ 

确实有更好的和更强大的测试方法,但是如果你有这样的需求,这个黑客应该可以工作。我建议最终将下面的bash脚本移动到python中,然后你需要做的就是调用./run_tests.py来运行你所有的单元测试。由于python比bash具有无限的表现力,因此您可以更自由地解释和显示结果。根据您的需要,使用像unittest这样的单元测试框架可能需要滚动您自己的代码。

+0

我得到了一个错误,我无法调试(“/ bin/sh:语法错误:文件意外结束(期待”然后“)”),但感谢您的尝试。我可能会使用用python编写的管理脚本。 – moraes 2011-04-03 12:27:08

+2

@moraes,与shell不同,makefile不会将其行继续(行末尾的'\')视为语句分隔符。尝试在需要的地方加上';'s之前的斜杠。 – 2011-04-03 12:33:00

+0

感谢Pavel,我在bash shell中单独测试了每一行,但是我没有在Makefile中测试这个脚本。你也可以把它全部移到一个文件调用'run_tests.sh'并从Makefile中调用它。 – Philip 2011-04-03 20:25:49

5

另一种方法是使用unittest发现,它会将所有单独的测试文件聚合成一次运行,例如,在Makefile

test: 
    python -m unittest discover -p '*tests.py' -v 

如果在并行进程运行测试对你很重要的话,而不是使用单元测试运行测试,使用鼻子或pytest。他们每个人都有可以并行运行测试的选项。

0

我有一个库目录有几个子目录,每个子目录都有自己的单元测试。要运行它们,我增加了以下测试目标:

test: $(addprefix test-,$(SUBDIRS)) 
test-%: 
     $(MAKE) -k --directory=$* test 

这是很酷的,因为它运行在每个子目录中的测试,可以使用分布式的,例如做测试-j5。但是,它有一个问题。理想情况下,我想在所有目录中运行测试,而不管个别目录中的失败。我还希望能够总结最后的失败,并且(更重要的是)能够在一个或多个测试失败时返回非零退出代码。上面的代码运行所有测试,但不打印摘要,也不打印非零退出状态。

这是一些更复杂的代码,它可以做我想做的事情。这不是很优雅,但:

clean_test: 
     rm -f testfailures 
test: clean_test 
     $(MAKE) $(addprefix test-,$(SUBDIRS)) 
     @echo "=== TEST SUMMARY ===" 
     @if [ -f $(BUILD_DIR)/testfailures ]; then \ 
      echo "The following tests failed:"; \ 
      cat $(BUILD_DIR)/testfailures; \ 
      false; \ 
     else \ 
      echo "All tests passed."; \ 
     fi 
test-%: 
     $(MAKE) -k --directory=$* test || echo \ 
      " $*" >> $(BUILD_DIR)/testfailures 
+1

当我的makefile内容变得这么复杂时,我发现将功能拉出到一个新的shell脚本中会让它更简单一些(我认为在shell脚本中减少了转义),并将makefile简化为非常易读。 – 2013-07-16 08:57:13