2

一連のテストを実行する単体テスト コードがあります。以前は、各テストが実行されると、一部の情報が stdout に出力されていました。この情報は、テストが失敗した場合のデバッグに大いに役立ちます。ここで、unittest を呼び出してテストの結果をプログラムで取得する、より洗練されたプログラムを作成したいと思います。unittest は、テストの出力を格納するための TestResult というオブジェクトを提供しているようです。すべてのエラーのリスト、すべての失敗のリストなどがあります。また、デバッグ出力をこのオブジェクトに追加して、後でプログラムでアクセスできるようにしたいと考えています。これは可能ですか?

編集:ここに例があります:

import unittest2

class DemoTest(unittest2.TestCase):
    def test_one(self):
        print "'grimelsome' attribute of 'smoxy' was set to 'blimpy'"
        self.assertTrue(True)

    def test_two(self):
        print "'smithereen' attribute of 'brouhaha' was set to 'False'"
        self.assertTrue(True)

if __name__ == '__main__':
    suite = unittest2.TestLoader().loadTestsFromTestCase(DemoTest)
    result = unittest2.TextTestRunner(verbosity=2).run(suite)

    # this is what I'd like to be able to do:
    for fail in result.failures:
        print what_would_have_gone_to_stdout
4

1 に答える 1

0

TextTestRunner バッファ オプションを使用するだけです。

import unittest2

class DemoTest(unittest2.TestCase):
    def test_one(self):
        print "'grimelsome' attribute of 'smoxy' was set to 'blimpy'"
        self.assertTrue(True)

    def test_two(self):
        print "'smithereen' attribute of 'brouhaha' was set to 'False'"
        self.assertTrue(False)

if __name__ == '__main__':
    suite = unittest2.TestLoader().loadTestsFromTestCase(DemoTest)
    result = unittest2.TextTestRunner(verbosity=2, buffer=True).run(suite)

各テストの前に、ランナーによって使用される は、とを独自のストリームにTextTestResult置き換え、テストが失敗した場合、またはそれ以外の場合はコンテンツを破棄した場合にのみ、コンテンツを元のストリームに送信します。sys.stderrsys.stdout

フェイクsys.std*ストリームは各テスト後に変更されるため、ログ出力で同じことを行いたい場合は、sys.sdt* ストリームが置き換えられた後、各テストの前にログ ハンドラーを追加するか、独自の実装を行う必要があることに注意してください。ハンドラ。

サブクラス化の例を次に示しlogging.StreamHandlerます。

import logging
import sys
import unittest2


class DemoTest(unittest2.TestCase):
    logger = logging.getLogger('DemoTest')

    def setUp(self):
        self.logger.debug("setting up stuff and logging it...")

    def teardown(self):
        self.logger.debug("You won't see me")
        print "me neither"

    def test_one(self):
        self.logger.debug("'grimelsome' attribute of 'smoxy' was set to 'blimpy'")
        self.assertTrue(True)

    def test_two(self):
        self.logger.debug("'smithereen' attribute of 'brouhaha' was set to 'False'")
        self.assertTrue(False)


class TestHandler(logging.StreamHandler):

    def __init__(self):
        logging.Handler.__init__(self)

    @property
    def stream(self):
        """Use which ever stream sys.stderr is referencing."""
        return sys.stderr


if __name__ == '__main__':
    formatter = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
    logger_handler = TestHandler()
    logger_handler.setFormatter(formatter)
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    logger.addHandler(logger_handler)

    suite = unittest2.TestLoader().loadTestsFromTestCase(DemoTest)
    result = unittest2.TextTestRunner(
        verbosity=2, buffer=True, resultclass=TestResult
    ).run(suite)
于 2013-12-02T02:10:33.037 に答える