我最終編寫了兩個新類,它們繼承自unittest.TextTestResult
和unittest.TextTestRunner
。這樣一來,我可以運行主要那樣:
unittest.main(testRunner=xmlrunner.XMLTestRunner(...))
我重載unittest.TextTestRunner
的__init__
和來自unittest.TextTestResult
:
addSuccess()
addError()
addFailure()
addSubTest()
例如:
def addSuccess(self, test):
super().addSuccess(test)
[... store the test into list, dictionary, whatever... ]
由於這些add*()
函數被調用的實際測試中,我可以將它們存儲在一個全局列表,並在我的XMLTestRunner.run()
結束它們解析:
def run(self, test):
result = super().run(test)
self.save_xml_report(result)
return result
請注意,這些功能通常在/usr/lib/python3.4/unittest/runner.py
中定義。
警告注意:通過使用一個實際的對象傳遞unittest.main()
的testRunner
參數如圖所示,推出蟒蛇時給出的命令行參數被忽略。例如,使用-v
參數增加詳細級別將被忽略。這是因爲在/usr/lib/python3.4/unittest/main.py
中定義的TestProgram
類會檢測unittest.main()
是否以testRunner
作爲類或對象運行(請參閱文件末尾附近的runTests()
)。如果你只給出這樣一個類:
unittest.main(testRunner=xmlrunner.XMLTestRunner)
然後命令行參數被解析。但是你傳遞一個實例化的對象(就像我需要的那樣),runTests()
就會按原樣使用它。因此我不得不在自己的解析參數XMLTestRunner.__init__()
:
# Similar to what /usr/lib/python3.4/unittest/main.py's TestProgram._getParentArgParser() does.
import argparse
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument('-v', '--verbose', dest='verbosity',
action='store_const', const=2, default=1, # Add default=1, not present in _getParentArgParser()
help='Verbose output')
parser.add_argument('-q', '--quiet', dest='verbosity',
action='store_const', const=0,
help='Quiet output')
parser.add_argument('-f', '--failfast', dest='failfast',
action='store_true',
help='Stop on first fail or error')
parser.add_argument('-c', '--catch', dest='catchbreak',
action='store_true',
help='Catch ctrl-C and display results so far')
parser.add_argument('-b', '--buffer', dest='buffer',
action='store_true',
help='Buffer stdout and stderr during tests')
謝謝,這是一條有趣的路徑。但我需要在測試中存儲更多的信息,而不是屏幕上顯示的信息。分析可能是相當單調乏味的... – 2014-10-22 20:08:08