Beispiel #1
0
    def run(self, result):
        """
        Emulate unittest's behavior, with Green-specific changes.
        """
        topLevel = False
        if getattr(result, '_testRunEntered', False) is False:
            result._testRunEntered = topLevel = True

        for index, test in enumerate(self):
            if result.shouldStop:
                break

            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)):
                    continue

                if not self.allow_stdout:
                    captured_stdout = StringIO()
                    captured_stderr = StringIO()
                    saved_stdout = sys.stdout
                    saved_stderr = sys.stderr
                    sys.stdout = GreenStream(captured_stdout)
                    sys.stderr = GreenStream(captured_stderr)

            test(result)

            if _isnotsuite(test):
                if not self.allow_stdout:
                    sys.stdout = saved_stdout
                    sys.stderr = saved_stderr
                    result.recordStdout(test, captured_stdout.getvalue())
                    result.recordStderr(test, captured_stderr.getvalue())
                # Since we're intercepting the stdout/stderr out here at the suite
                # level, we need to poke the test result and let it know when we're
                # ready to transmit results back up to the parent process.  I would
                # rather just do it automatically at test stop time, but we don't
                # have the captured stuff at that point.  Messy...but the only other
                # alternative I can think of is monkey-patching loaded TestCases --
                # which could be from unittest or twisted or some other custom
                # subclass.
                result.finalize()

            self._removeTestAtIndex(index)

        if topLevel:
            self._tearDownPreviousClass(None, result)
            self._handleModuleTearDown(result)
            result._testRunEntered = False
        return result
Beispiel #2
0
    def run(self, result):
        """
        Emulate unittest's behavior, with Green-specific changes.
        """
        topLevel = False
        if getattr(result, '_testRunEntered', False) is False:
            result._testRunEntered = topLevel = True

        for index, test in enumerate(self):
            if result.shouldStop:
                break

            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)):
                    continue

                if not self.allow_stdout:
                    captured_stdout = StringIO()
                    captured_stderr = StringIO()
                    saved_stdout = sys.stdout
                    saved_stderr = sys.stderr
                    sys.stdout = GreenStream(captured_stdout)
                    sys.stderr = GreenStream(captured_stderr)

            test(result)

            if _isnotsuite(test):
                if not self.allow_stdout:
                    sys.stdout = saved_stdout
                    sys.stderr = saved_stderr
                    result.recordStdout(test, captured_stdout.getvalue())
                    result.recordStderr(test, captured_stderr.getvalue())
                # Since we're intercepting the stdout/stderr out here at the suite
                # level, we need to poke the test result and let it know when we're
                # ready to transmit results back up to the parent process.  I would
                # rather just do it automatically at test stop time, but we don't
                # have the captured stuff at that point.  Messy...but the only other
                # alternative I can think of is monkey-patching loaded TestCases --
                # which could be from unittest or twisted or some other custom
                # subclass.
                result.finalize()

            self._removeTestAtIndex(index)

        if topLevel:
            self._tearDownPreviousClass(None, result)
            self._handleModuleTearDown(result)
            result._testRunEntered = False
        return result
Beispiel #3
0
    def run(self, result, debug=False):
        top_level = False
        # getattr()函数,返回result对象的_testRunEntered属性值,默认值是False
        if getattr(result, '_testRunEntered', False) is False:
            result._testRunEntered = top_level = True

        for index, test in enumerate(self):
            if result.shouldStop:
                break

            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)):
                    continue

            if not debug:
                test(result)
            else:
                test.debug()

            if self._cleanup:
                self._removeTestAtIndex(index)

        if top_level:
            self._tearDownPreviousClass(None, result)
            self._handleModuleTearDown(result)
            result._testRunEntered = False
        return result
Beispiel #4
0
    def run_suite(self, suite, result, run_func=None, interval=None):
        """基础运行suite方法,支持指定运行方法"""
        log.info('执行测试套件:', suite)
        topLevel = False
        if getattr(result, '_testRunEntered', False) is False:
            result._testRunEntered = topLevel = True

        for index, test in enumerate(suite):
            if _isnotsuite(test):
                setup_ok = run_suite_before_case(suite, test, result)
                if not setup_ok:
                    continue
            log.info('执行用例:', test.id())
            run_func(test, result) if run_func else test(result)  # 可能是suite 可能有异常
            log.info('执行结果:', test.status, '执行时间:', test.duration)
            time.sleep(interval) if interval else None

            if suite._cleanup:
                suite._removeTestAtIndex(index)

        if topLevel:
            run_suite_after(suite, result)
            result._testRunEntered = False

        return result
    def run(self, result, debug=False):
        topLevel = False
        if getattr(result, '_testRunEntered', False) is False:
            result._testRunEntered = topLevel = True

        for test in self:
            if result.shouldStop:
                break

            start_time = _time()

            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)):
                    continue

            if not debug:
                test(result)
            else:
                test.debug()

            TIMINGS[str(test)] = _time() - start_time

        if topLevel:
            self._tearDownPreviousClass(None, result)
            self._handleModuleTearDown(result)
            result._testRunEntered = False

        return result
Beispiel #6
0
    def run(self, result, debug=False):
        topLevel = False
        if getattr(result, '_testRunEntered', False) is False:
            result._testRunEntered = topLevel = True

        for test in self:
            if result.shouldStop:
                break

            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)):
                    continue

            if not debug:
                test(result)
            else:
                test.debug()

        if topLevel:
            self._tearDownPreviousClass(None, result)
            self._handleModuleTearDown(result)
            result._testRunEntered = False
        return result
Beispiel #7
0
    def run(self, result):
        """
        Emulate unittest's behavior, with Green-specific changes.
        """
        topLevel = False
        if getattr(result, '_testRunEntered', False) is False:
            result._testRunEntered = topLevel = True

        for index, test in enumerate(self):
            if result.shouldStop:
                break

            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)):
                    continue

                if not self.allow_stdout:
                    captured_stdout = StringIO()
                    captured_stderr = StringIO()
                    saved_stdout = sys.stdout
                    saved_stderr = sys.stderr
                    sys.stdout = GreenStream(captured_stdout)
                    sys.stderr = GreenStream(captured_stderr)

            test(result)

            if _isnotsuite(test):
                if not self.allow_stdout:
                    sys.stdout = saved_stdout
                    sys.stderr = saved_stderr
                    result.recordStdout(test, captured_stdout.getvalue())
                    result.recordStderr(test, captured_stderr.getvalue())

            self._removeTestAtIndex(index)

        if topLevel:
            self._tearDownPreviousClass(None, result)
            self._handleModuleTearDown(result)
            result._testRunEntered = False
        return result
Beispiel #8
0
    def run(self, result, debug=False):
        topLevel = False

        if getattr(result, '_testRunEntered', False) is False:
            result._testRunEntered = topLevel = True

        for index, test in enumerate(self):
            retry = getattr(test, "retry", python_config.RETRY)
            if result.shouldStop:
                break

            for i in range(1, retry + 2):
                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)):
                        continue

                logger.info("用例: {}正在尝试第{}次运行!".format(test.__class__.__name__,
                                                       i))
                if not debug:
                    test(result)
                else:
                    test.debug()
                if i < retry + 1:
                    # 重试判断  这段写的很丑就别细看了,欢迎优化
                    error, fail = None, None
                    fail_id = [x.get("case_id") for x in result.failures]
                    error_id = [x.get("case_id") for x in result.errors]
                    if test.case_id in fail_id:
                        fail = fail_id.index(test.case_id)
                    if test.case_id in error_id:
                        error = error_id.index(test.case_id)
                    if error is not None and fail is not None:
                        break
                    elif error is not None:
                        logger.warning("用例: {} 第{}次失败 原因: {}".format(
                            test.__class__.__name__, i,
                            str(result.errors[error]['msg'])))
                        del result.errors[error]
                    elif fail is not None:
                        logger.warning("用例: {} 第{}次失败 原因: {}".format(
                            test.__class__.__name__, i,
                            str(result.failures[fail]['msg'])))
                        del result.failures[fail]
                    result._previousTestClass = test.__class__
                    continue
            if self._cleanup:
                self._removeTestAtIndex(index)

        if topLevel:
            self._tearDownPreviousClass(None, result)
            self._handleModuleTearDown(result)
            result._testRunEntered = False
        return result
    def run(self, result, debug=False):
        """
        overrides TestSuite's run() method, with few changes,
        except that this method swaps in the template db before
        each test is run!
        """
        if self.test_db_name is None or self.template_db_name is None:
            err_msg = 'test_db_name & template_db_name must be set before run() can be called!'
            raise self.SetupException(err_msg)

        topLevel = False
        if getattr(result, '_testRunEntered', False) is False:
            result._testRunEntered = topLevel = True

        for test in self:
            if result.shouldStop:
                break

            #
            # previous to the test execution,
            # copy our template test db into the test db
            # and then instantiate the test
            # TODO - db connection.close()
            PgUtil.clone_db(self.template_db_name, self.test_db_name,
                            self.requires_sudo)
            # TODO - settings.DATABASES[self.connection.alias]["NAME"] = self.test_db_name
            # TODO - self.connection.settings_dict["NAME"] = self.test_db_name
            # TODO - not sure if we HAVE to do this, but try it with it and without it
            connection.ensure_connection()
            countdown = 5
            while countdown >= 0:
                time.sleep(0.5)
                SSHELP.check_score_systems()
                countdown -= 0.5

            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)):
                    continue

            if not debug:
                #
                # now make the test
                test(result)
            else:
                test.debug()

        if topLevel:
            self._tearDownPreviousClass(None, result)
            self._handleModuleTearDown(result)
            result._testRunEntered = False
        return result
Beispiel #10
0
    def run(self, result, debug=False):
        print(result, '打印结果')

        fail_count = 5
        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 > fail_count:
                            success_flag = False
                        else:
                            time.sleep(5)
                            result._previousTestClass = None
                            print('%s Retrying init for %s times...' %
                                  (test.__class__, class_num))
                            class_num += 1
                        continue

                if not debug:
                    print(test(result), '打印test结果')
                    test(result)
                    print('1')
                else:
                    test.debug()

                if result.result[-1][0] == 1 or result.result[-1][
                        0] == 2:  # 1为Failed,2为Error
                    if case_num > fail_count:
                        success_flag = False
                    else:
                        print('%s is Failed ! Retrying %s times...' %
                              (test, case_num))
                        case_num += 1
                else:
                    success_flag = False

            if topLevel:
                self._tearDownPreviousClass(None, result)
                self._handleModuleTearDown(result)
                result._testRunEntered = False
        return result
Beispiel #11
0
    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 suite._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
Beispiel #12
0
    def run(self, result, debug=False):
        topLevel = False
        if getattr(result, '_testRunEntered', False) is False:
            result._testRunEntered = topLevel = True

        for test in self:
            if result.shouldStop:
                break

            if _isnotsuite(test):
                deferred = self._tearDownPreviousClass(test, result)
                if deferred is not None and hasattr(deferred, '__iter__'):
                    for x in deferred:
                        yield x
                yield
                self._handleModuleFixture(test, result)
                yield
                deferred = self._handleClassSetUp(test, result)
                if deferred is not None and hasattr(deferred, '__iter__'):
                    for x in deferred:
                        yield x
                yield
                result._previousTestClass = test.__class__

                if (getattr(test.__class__, '_classSetupFailed', False) or
                        getattr(result, '_moduleSetUpFailed', False)):
                    continue

            if not debug:
                deferred = test(result)
                if deferred is not None and hasattr(deferred, '__iter__'):
                    for x in deferred:
                        yield x
            else:
                deferred = test.debug()
                if deferred is not None and hasattr(deferred, '__iter__'):
                    for x in deferred:
                        yield x
            yield

        if topLevel:
            deferred = self._tearDownPreviousClass(None, result)
            if deferred is not None and hasattr(deferred, '__iter__'):
                for x in deferred:
                    yield x
            yield
            yield
            self._handleModuleTearDown(result)
            yield
            result._testRunEntered = False
Beispiel #13
0
    def run(self, result, debug=False):
        topLevel = False
        if getattr(result, '_testRunEntered', False) is False:
            result._testRunEntered = topLevel = True

        for test in self:
            if result.shouldStop:
                break

            if _isnotsuite(test):
                deferred = self._tearDownPreviousClass(test, result)
                if deferred is not None and hasattr(deferred, '__iter__'):
                    for x in deferred:
                        yield x
                yield
                self._handleModuleFixture(test, result)
                yield
                deferred = self._handleClassSetUp(test, result)
                if deferred is not None and hasattr(deferred, '__iter__'):
                    for x in deferred:
                        yield x
                yield
                result._previousTestClass = test.__class__

                if (getattr(test.__class__, '_classSetupFailed', False)
                        or getattr(result, '_moduleSetUpFailed', False)):
                    continue

            if not debug:
                deferred = test(result)
                if deferred is not None and hasattr(deferred, '__iter__'):
                    for x in deferred:
                        yield x
            else:
                deferred = test.debug()
                if deferred is not None and hasattr(deferred, '__iter__'):
                    for x in deferred:
                        yield x
            yield

        if topLevel:
            deferred = self._tearDownPreviousClass(None, result)
            if deferred is not None and hasattr(deferred, '__iter__'):
                for x in deferred:
                    yield x
            yield
            yield
            self._handleModuleTearDown(result)
            yield
            result._testRunEntered = False
Beispiel #14
0
    def run(self, result, debug=False):
        topLevel = False
        if getattr(result, '_testRunEntered', False) is False:
            result._testRunEntered = topLevel = True

        for index, test in enumerate(self):
            if result.shouldStop:
                break

            if _isnotsuite(test):
                deferred = self._tearDownPreviousClass(test, result)
                if isiterable(deferred):
                    yield from deferred
                yield
                self._handleModuleFixture(test, result)
                yield
                deferred = self._handleClassSetUp(test, result)
                if isiterable(deferred):
                    yield from deferred
                yield
                result._previousTestClass = test.__class__

                if getattr(test.__class__, '_classSetupFailed', False) or \
                        getattr(result, '_moduleSetUpFailed', False):
                    continue

            if not debug:
                deferred = test(result)
            else:
                deferred = test.debug()

            if self._cleanup:
                self._removeTestAtIndex(index)

            if isiterable(deferred):
                yield from deferred

            yield

        if topLevel:
            deferred = self._tearDownPreviousClass(None, result)
            if isiterable(deferred):
                yield from deferred
            yield
            yield
            self._handleModuleTearDown(result)
            yield
            result._testRunEntered = False
Beispiel #15
0
    def _threadPoolExecutorTestCase(self, tmp_list, result):
        """多线程运行"""
        with ThreadPoolExecutor(self.thread_count) as pool:
            for test_case in tmp_list:
                if _isnotsuite(test_case):
                    self._tearDownPreviousClass(test_case, result)
                    self._handleModuleFixture(test_case, result)
                    self._handleClassSetUp(test_case, result)
                    result._previousTestClass = test_case.__class__

                    if (getattr(test_case.__class__, '_classSetupFailed',
                                False)
                            or getattr(result, '_moduleSetUpFailed', False)):
                        continue
                pool.submit(test_case, result)
                time.sleep(self.thread_start_wait)
        self._tearDownPreviousClass(None, result)
        self._handleModuleTearDown(result)
Beispiel #16
0
def new_run(self, result, debug=False):
    """
    :param self: 表示'suit'实例对象
    :param result: 测试结果报告
    :param debug:
    :return:

     动态修改'suite.py'文件中'TestSuite'类中的'run'方法
      1.为实例对象'suite'<TestSuite>动态修改实例方法'run'
      2.目的:启用多线程来执行case
    """
    topLevel = False
    if getattr(result, '_testRunEntered', False) is False:
        result._testRunEntered = topLevel = True

    # 多线程执行测试
    pool = ThreadPoolExecutor(self.thread_num)
    for index, test in enumerate(self):
        if result.shouldStop:
            break

        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)):
                continue

        """ 启用多线程 调用方法 """
        pool.submit(run_test_custom, self, test, result, debug, index).add_done_callback(show_result_custom)

    """ 等待所有线程执行完毕 """
    pool.shutdown()

    log.info("线程全部执行完毕")

    if topLevel:
        self._tearDownPreviousClass(None, result)
        self._handleModuleTearDown(result)
        result._testRunEntered = False
    return result
Beispiel #17
0
    def run(self, result, debug=False):
        topLevel = False
        if getattr(result, '_testRunEntered', False) is False:
            result._testRunEntered = topLevel = True

        for test in self:
            if result.shouldStop:
                break

            start_time = _time()

            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)):
                    continue

            if not debug:
                test(result)
            else:
                test.debug()
            self.save_test_time(str(test), _time() - start_time)

            if time_only:
                timing = _time() - start_time
                if timing > valid_time:
                    print(
                        "\n\033[31m{t:.4f}s\033[0m \033[94m{f}\033[0m".format(
                            f=str(test), t=float(timing)))
                else:
                    print(
                        "\n\033[32m{t:.4f}s\033[0m \033[94m{f}\033[0m".format(
                            f=str(test), t=float(timing)))

        if topLevel:
            self._tearDownPreviousClass(None, result)
            self._handleModuleTearDown(result)
            result._testRunEntered = False

        return result
Beispiel #18
0
    def run_suite(self, suite, result, run_func=None, interval=None):
        topLevel = False
        if getattr(result, '_testRunEntered', False) is False:
            result._testRunEntered = topLevel = True

        for index, test in enumerate(suite):
            if _isnotsuite(test):
                setup_ok = run_suite_before_case(suite, test, result)
                if not setup_ok:
                    continue

            run_func(test, result) if run_func else test(
                result)  # 可能是suite 可能有异常
            time.sleep(interval) if interval else None

            if suite._cleanup:
                suite._removeTestAtIndex(index)

        if topLevel:
            run_suite_after(suite, result)
            result._testRunEntered = False

        return result
Beispiel #19
0
    def run(self, result, debug=False):
        failcount = 3  # 失败总运行次数
        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


# 单个用例自动重跑装饰器,使用方法 @retry(2)

# def retry(times = 3):
#     def retry_func(func):
#         def _(*args, **kwds):
#             for i in range(times):
#                 try:
#                     func(*args, **kwds)
#                     return
#                 except AssertionError:
#                     pass
#             raise AssertionError(func)
#         return _
#     return retry_func
Beispiel #20
0
    def run(self, result):
        """
        Emulate unittest's behavior, with Green-specific changes.
        """
        topLevel = False
        if getattr(result, "_testRunEntered", False) is False:
            result._testRunEntered = topLevel = True

        for index, test in enumerate(self):
            if result.shouldStop:
                break

            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):
                    continue

                if not self.allow_stdout:
                    captured_stdout = StringIO()
                    captured_stderr = StringIO()
                    saved_stdout = sys.stdout
                    saved_stderr = sys.stderr
                    sys.stdout = GreenStream(captured_stdout)
                    sys.stderr = GreenStream(captured_stderr)

            test(result)

            if _isnotsuite(test):
                if not self.allow_stdout:
                    sys.stdout = saved_stdout
                    sys.stderr = saved_stderr
                    result.recordStdout(test, captured_stdout.getvalue())
                    result.recordStderr(test, captured_stderr.getvalue())
                # Since we're intercepting the stdout/stderr out here at the
                # suite level, we need to poke the test result and let it know
                # when we're ready to transmit results back up to the parent
                # process.  I would rather just do it automatically at test
                # stop time, but we don't have the captured stuff at that
                # point.  Messy...but the only other alternative I can think of
                # is monkey-patching loaded TestCases -- which could be from
                # unittest or twisted or some other custom subclass.
                result.finalize()

            self._removeTestAtIndex(index)

        # Green's subprocesses have handled all actual tests and sent up the
        # result, but unittest expects to be able to add teardown errors to
        # the result still, so we'll need to watch for that ourself.
        errors_before = len(result.errors)

        if topLevel:
            self._tearDownPreviousClass(None, result)
            self._handleModuleTearDown(result)
            result._testRunEntered = False

        # Special handling for class/module tear-down errors. startTest() and
        # finalize() both trigger communication between the subprocess and
        # the runner process. addError()
        if errors_before != len(result.errors):
            difference = len(result.errors) - errors_before
            result.errors, new_errors = (
                result.errors[:-difference],
                result.errors[-difference:],
            )
            for (test, err) in new_errors:
                # test = ProtoTest()
                test.module = result._previousTestClass.__module__
                test.class_name = result._previousTestClass.__name__
                # test.method_name = 'some method name'
                test.is_class_or_module_teardown_error = True
                test.name = "Error in class or module teardown"
                # test.docstr_part = 'docstr part' # error_holder.description
                result.startTest(test)
                result.addError(test, err)
                result.stopTest(test)
                result.finalize()
        return result
Beispiel #21
0
 def _collect(suite):
     for test in suite:
         if _isnotsuite(test):
             new_suite.addTest(test)
         elif test.countTestCases() > 0:
             _collect(test)