如何使用Makefile结合unittest结果?

时间:2011-04-03 11:03:28

标签: python unit-testing makefile

我想使用Makefile来运行单个测试文件或所有测试或覆盖率报告的组合版本。

我对Makefiles很新,所以我借了一个并改编了它。结果是here

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

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

(我只想使用Makefile + unittest + coverage,没有其他依赖项)

3 个答案:

答案 0 :(得分:5)

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

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

如果在并行进程中运行测试对您来说很重要,那么请使用nose或pytest来代替使用unittest来运行测试。他们每个人都有选择并行运行测试。

答案 1 :(得分: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这样的单元测试框架可能需要滚动您自己的代码。

答案 2 :(得分:0)

我有一个包含多个子目录的库目录,每个子目录都有自己的单元测试。为了全部运行,我添加了以下测试目标:

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

这很酷,因为它在每个子目录中运行测试,并且可以使用例如make 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