2011-04-03 37 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