我想使用Makefile来运行单个测试文件或所有测试或覆盖率报告的组合版本。
我对Makefiles很新,所以我借了一个并改编了它。结果是here。
问题是make test
将按顺序运行每个测试,当你有一堆并且屏幕滚动很多时很难看出哪些失败了。我喜欢每个人使用一个单独的过程,所以他们不会互相干扰。
问题是:我可以仅使用Makefile更好地组合结果,还是需要单独的脚本?你知道一些运行测试的Makefile的好例子吗?
(我只想使用Makefile + unittest + coverage,没有其他依赖项)
答案 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