修改pyunit主要是基于一个比较小的需求,在测试用例列表中,失败的用例需要重新执行,直到用例通过或者达到次数上限N,如果N次执行全部失败,用例的执行结果为最后一次执行的结果。
分析:
如果自己写一个简单用例集调用和结果收集逻辑,实现这个需求很容易,但是有两个问题:
所以好的方法就是从pyunit框架入手,不过pyunit不支持这样的逻辑。pyunit是python版的junit,junit是java版的smalltalk,它们都不支持这样的逻辑。一种最简单的办法,是正常的使用pyunit执行一次测试集,之后将失败的用例收集起来,再次执行,如此一直进行下去。对于独立的用例,这个方法是没有问题的,但是对于用例顺序有关联性的情况,这种方法带来的结果会带有很大的随机性。
可行性的办法是在pyunit中加入这个逻辑,在执行用例的时候循环判断一下,当结果正确,则循环结束,否则继续重复执行,并记录最有一次失败的结果。简单的修改办法如下:
class TestCase: def run(self, result=None): if result is None: result = self.defaultTestResult() result.startTest(self) testMethod = getattr(self, self._testMethodName) try: try: self.setUp() except KeyboardInterrupt: raise except: result.addError(self, self._exc_info()) return ok = False n = 1 try: while n<=self.repeat or ok is False: try: testMethod() ok = True break except Exception as e: if n == self.repeat: raise self.failureException(str(e)) finally: n+=1 except self.failureException: result.addFailure(self, self._exc_info()) except KeyboardInterrupt: raise except: result.addError(self, self._exc_info()) try: self.tearDown() except KeyboardInterrupt: raise except: result.addError(self, self._exc_info()) ok = False if ok: result.addSuccess(self) finally: result.stopTest(self)