8

unittest docs [ http://docs.python.org/2/library/unittest.html#unittest.main ]に、次のメソッドシグネチャが記述されているのがわかります。

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ましたが、違いはありませんでした。)

4

2 に答える 2

9

重要なのは、バッファオプションは、unittest2の動作を無視して、テスト内のstdoutの書き込みに影響を与えるということです。つまり、次のような文字列を追加すると、違いがわかります。

print "Suppress me!"

どのテストメソッドでも、この式は、を選択するとstdoutに表示されますがbuffer=False、Trueに設定すると抑制されます。

于 2013-01-09T20:20:15.253 に答える
4

コメントで説明したようにbuffer、テストされたコードからの出力をバッファリングするだけです。これは、unittest2それ自体からのみ出力を取得することを意味します。完全に機能しています。(あなたの場合、それも簡単に機能します。コードは何も出力しないので、バッファー間で何もありません。そのため、それがなくても同じ結果が得られます。)

どちらからも出力したくない場合はunittest2、にリダイレクトするシェルコマンドラインを使用してスクリプトを実行するか、にリダイレクトするスクリプトから/dev/nullインポートすることができます。unittest2sys.stdout

しかし、通常は、単に破棄するのではなく、実際にそのstdoutを読みたいと思うでしょう。どこにも記録したくない場合でも、最後の行が"OK"であることを確認したいので、プログラミングチームや、失敗したときに行うことすべてに感電を送ることができます。それ以外の場合、経由でテストを実行するポイントは何cronですか?

于 2013-01-09T20:29:02.517 に答える