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
以上おわり。