2013-01-09 47 views
6

在單元測試文檔[http://docs.python.org/2/library/unittest.html#unittest.main],我看到所描述的以下的方法簽名:python unittest - 使用'緩衝'選項來抑制標準輸出 - 我該怎麼做?

unittest.main([module[, defaultTest[, argv[, testRunner[, testLoader[, exit[, verbosity[, failfast[, catchbreak[, buffer]]]]]]]]]]) 

最後一個選項是「緩衝」。該文檔解釋了有關此選項的以下內容:

failfast,catchbreak和buffer參數與同名命令行選項具有相同的效果。

爲命令行選項[http://docs.python.org/2/library/unittest.html#command-line-options]解釋「緩衝」如下的文檔:

-b,--buffer
標準輸出和標準錯誤流在測試期間緩衝跑。丟棄通過測試期間的輸出。輸出在測試失敗或錯誤時正常回顯並被添加到失敗消息中。

我有下面的演示代碼沒有表現出預期的行爲:

import unittest2 

class DemoTest(unittest2.TestCase): 
    def test_one(self): 
     self.assertTrue(True) 

    def test_two(self): 
     self.assertTrue(True) 

if __name__ == '__main__': 
    test_program = unittest2.main(verbosity=0, buffer=True, exit=False) 

這個程序的輸出是:

---------------------------------------------------------------------- 
Ran 2 tests in 0.000s 

OK 

事實上,我得到的如果我將我的程序中的最後一行改爲:

test_program = unittest2.main(verbosity=0, buffer="hello", exit=False) 

我在做什麼錯? (我嘗試使用unittest而不是unittest2,但它沒有區別。)

+1

你想看什麼?這看起來完全正確 - 它是測試套件本身的輸出,沒有測試代碼的輸出。這正是'緩衝區'的存在,並且它的工作完美。 (在你的情況下,它也是平凡的工作 - 你的代碼不會打印任何東西,所以'buffer'沒有任何緩衝區,這就是爲什麼你沒有它就得到相同的結果。)如果你想要一些不同的東西,請告訴我們_你想要什麼。 – abarnert

+0

我不想看到任何輸出。文檔說「通過測試期間的輸出被丟棄」。如果測試失敗,我希望只看到輸出。由於我是通過cron運行的,所以即使是單個字符的輸出也是不可接受的,因爲它會導致發送電子郵件。因此,例如,「OK」這個詞不應該出現。 – jononomo

+0

好的,我明白現在發生了什麼。基本上,程序仍然會產生輸出,而不是測試方法中產生的輸出。 – jononomo

回答

7

問題是,buffer option會影響寫入測試的stdout,忽略unittest2行爲。也就是說,你會看到區別,如果添加字符串如

print "Suppress me!" 

任何測試方法,如果你將它設置爲這個表達式將出現在標準輸出,如果選擇buffer=False,而這將被抑制真正。

3

正如我在評論中所解釋的,buffer只是緩衝了測試代碼的輸出。這意味着您只能從unittest2本身獲得輸出。它的工作完美。 (在你的情況下,它也是平凡的工作 - 你的代碼不會打印任何東西,所以緩衝區沒有任何緩衝區,這就是爲什麼你沒有它會得到相同的結果。)

如果你不想要任何從unittest2輸出,您始終可以使用重定向到/dev/null的shell命令行或從重定向sys.stdout的腳本中導入unittest2來運行該腳本。

但通常你實際上想要看過那stdout,不只是丟棄它。即使您不想在任何地方登錄,您也想檢查最後一行是否爲"OK",這樣您可以向編程團隊發送電擊或任何失敗時的操作。否則,通過cron運行測試有什麼意義?

+0

當您通過cron運行程序時,可以將其設置爲發送包含程序輸出的電子郵件。但是,如果測試成功,我不希望發送電子郵件 - 只有當它們失敗時才發送。我現在基本上是重寫它來將stdout重定向到一個文件,然後我只有在測試失敗時纔會將文件轉儲到stdout。非常感謝您的解釋。 – jononomo

+0

@JonCrowell:我幾年前就是這麼做的。但我懷疑,現在,建立一個真正的CI系統比像這樣將自己綁在一起更容易。 (另外,當你最終聘請一名真正的建築工程師時,他不會嘲笑你。) – abarnert

+0

什麼是CI系統?任何指向知識博客帖子的最佳途徑來解決這個問題將不勝感激。以這種方式爲unittests設置cron作業看起來異常困難 - 我剛剛意識到,我甚至無法將stdout重定向到文件 - 它只能用於我的測試方法的輸出,但不能對於單元測試本身產生的文本。 – jononomo