經過多次研讀和調試unittest代碼,后來發現一個也可以重運行setUp()和dearDown()的解決辦法,那就是修改源碼,我們重新建一個模塊套件類來覆蓋原來的TestSuite類
實例代碼:
- class Suit(unittest.TestSuite):
- def run(self, result, debug=False):
- failcount = 1#失敗總運行次數
- class_num = 1
- topLevel = False
- if getattr(result, '_testRunEntered', False) is False:
- result._testRunEntered = topLevel = True
- for test in self:
- case_num = 1
- if result.shouldStop:
- break
- success_flag = True
- while success_flag:
- if _isnotsuite(test):
- self._tearDownPreviousClass(test, result)
- self._handleModuleFixture(test, result)
- self._handleClassSetUp(test, result)
- result._previousTestClass = test.__class__
- if (getattr(test.__class__, '_classSetupFailed', False) or
- getattr(result, '_moduleSetUpFailed', False)):
- if class_num > failcount:
- success_flag = False
- else:
- time.sleep(5)
- result._previousTestClass = None
- print '類%s第%s次重新初始化執行'%(test.__class__,class_num)
- class_num += 1
- continue
- if not debug:
- test(result)
- else:
- test.debug()
- if result.result[-1][0]==1 or result.result[-1][0]==2:#結果為fail和err用例判斷
- if case_num > failcount:
- success_flag = False
- else:
- print '用例%s第%s次重新執行'%(test,case_num)
- case_num += 1
- else:
- success_flag = False
- if topLevel:
- self._tearDownPreviousClass(None, result)
- self._handleModuleTearDown(result)
- result._testRunEntered = False
- return result
然后測試使用
alltests=suit.Suit()
alltests.addtest(WidgetTestCase("testDefaultSize"))
runner =HTMLTestRunner.HTMLTestRunner(stream=fp,verbosity=2,title='Android測試報告',description='用例執行情況:',)
runner.run(alltests)
運行完后,有失敗重運行的用例都會打印在測試報告里,方便查閱