XMLTestRunner の 標準出力(stdout) どこいった?

XMLTestRunner を使ってて気づいた事メモ。XMLTestRunnerに限った話じゃないかもしんない。下記のように XMLTestRunnerを走らせているとする

#-*- coding:utf8 -*-

import unittest
import xmlrunner

test_path = './'

suite = unittest.loader.TestLoader().discover(test_path)
xmlrunner.XMLTestRunner(verbose=True).run(suite)

discoverでテストケースをさらって、テストを実行してXMLでreportを吐き出してくれる。
これを実行すると、標準出力には下記のような結果が表示される。

Running tests...
----------------------------------------------------------------------
  test_hoge (hoge.HogeTest) ... OK (0.037s)
  test_hoge2 (hoge.HogeTest2) ... OK (0.046s)
  test_hoge3 (hoge.HogeTest3) ... OK (0.029s)
  test_hoge4 (hoge.HogeTest3) ... OK (0.001s)

----------------------------------------------------------------------
Ran 4 tests in 0.114s

OK

Generating XML reports...

この時「hoge.HogeTest」の中で、 printで何かを出力したとする。けど、上の結果の中には printした内容は表示されない。

class HogeTest(unittest.TestCase):
        
  def test_hoge(self):
    print "fugafugafuga" #=> テストランナーの結果出力には 「fugafugafuga」は出力されない。

じゃあ「fugafugafuga」はどこいった? XMLTestRunnerはテスト結果を出力するために、「sys.stdout」と「sys.stderr」をなんかゴニョゴニョして、元のsys.stdout とsys.stderr はどこかに退避させてしまっているようだった。

調べてみたら、_XMLTestResultの中では、オリジナルのstdoutを持ってるっぽいので下記のようにして、テストランナーが終わったら一緒に出力されるようにした。

#-*- coding:utf8 -*-

import unittest
import xmlrunner

test_path = './'

suite = unittest.loader.TestLoader().discover(test_path)
result = xmlrunner.XMLTestRunner(verbose=True).run(suite)
orignal_stdout = result._original_stdout.getvalue()
if orignal_stdout:
    print 'Original STDOUT...'
    print '-' * 50
    print orignal_stdout
    print '-' * 50

これを実行すると、テストランナーの結果の後に、テストケースやらなんやらでprintした内容が表示されるようになった。
先ほどの「fugafugafuga」もこんな風に表示される

Running tests...
----------------------------------------------------------------------
  test_hoge (hoge.HogeTest) ... OK (0.037s)
  test_hoge2 (hoge.HogeTest2) ... OK (0.046s)
  test_hoge3 (hoge.HogeTest3) ... OK (0.029s)
  test_hoge4 (hoge.HogeTest3) ... OK (0.001s)

----------------------------------------------------------------------
Ran 4 tests in 0.114s

OK

Generating XML reports...
Original STDOUT...
--------------------------------------------------
fugafugafuga

--------------------------------------------------

もっと良い方法を誰か知ってたら教えて下しあm(_ _)m
以上おわり。