pyunit对重复执行用例的支持

        修改pyunit主要是基于一个比较小的需求,在测试用例列表中,失败的用例需要重新执行,直到用例通过或者达到次数上限N,如果N次执行全部失败,用例的执行结果为最后一次执行的结果。

分析:

        如果自己写一个简单用例集调用和结果收集逻辑,实现这个需求很容易,但是有两个问题:

  1. 之前的架构是基于pyunit的,而且最终执行的py脚本是动态写出后编译而成的,重新写用例集逻辑的话,整体改动和调试代价比较大;
  1. pyunit中提供的一些成熟的功能不能被使用,新写的话需要时间保证稳定,毕竟在环境架构已经稳定的前提下改变核心的东西不是很可取;

        所以好的方法就是从pyunit框架入手,不过pyunit不支持这样的逻辑。pyunitpython版的junitjunitjava版的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)

  

你可能感兴趣的:(it)