コード例 #1
0
    def run(self, test):
        session_start = time.monotonic()
        cases = tb.get_test_cases([test])
        setup = tb.get_test_cases_setup(cases)
        bootstrap_time_taken = 0
        tests_time_taken = 0
        result = None
        cluster = None
        conn = None

        try:
            if setup:
                if self.verbosity >= 1:
                    self._echo(
                        'Populating test databases... ',
                        fg='white',
                        nl=False,
                    )

                if self.verbosity > 1:
                    self._echo(
                        '\n -> Bootstrapping EdgeDB instance...',
                        fg='white',
                        nl=False,
                    )

                cluster = tb._init_cluster(cleanup_atexit=False)

                if self.verbosity > 1:
                    self._echo(' OK')

                conn = cluster.get_connect_args()
                tb.setup_test_cases(
                    cases,
                    conn,
                    self.num_workers,
                    verbose=self.verbosity > 1,
                )

                os.environ.update({
                    'EDGEDB_TEST_CASES_SET_UP': "1"
                })

                bootstrap_time_taken = time.monotonic() - session_start

                if self.verbosity >= 1:
                    self._echo(' OK')

            start = time.monotonic()

            all_tests = list(itertools.chain.from_iterable(
                tests for tests in cases.values()))

            if self.num_workers > 1:
                suite = ParallelTestSuite(
                    self._sort_tests(cases),
                    conn,
                    self.num_workers)
            else:
                suite = SequentialTestSuite(
                    self._sort_tests(cases),
                    conn
                )

            result = ParallelTextTestResult(
                stream=self.stream, verbosity=self.verbosity,
                warnings=self.warnings, failfast=self.failfast,
                output_format=self.output_format,
                tests=all_tests, suite=suite)
            unittest.signals.registerResult(result)

            self._echo()
            suite.run(result)

            tests_time_taken = time.monotonic() - start

        except KeyboardInterrupt:
            raise

        finally:
            if self.verbosity == 1:
                self._echo()

            if setup:
                self._echo()
                self._echo('Shutting down test cluster... ', nl=False)
                tb._shutdown_cluster(cluster, destroy=True)
                self._echo('OK.')

        if result is not None:
            self._render_result(
                result, bootstrap_time_taken, tests_time_taken)

        return result
コード例 #2
0
def _run(*, include, exclude, verbosity, files, jobs, output_format,
         warnings, failfast, shuffle, repeat, selected_shard, total_shards,
         running_times_log_file, list_tests):
    suite = unittest.TestSuite()

    total = 0
    total_unfiltered = 0

    if verbosity > 0:
        def _update_progress(n, unfiltered_n):
            nonlocal total, total_unfiltered
            total += n
            total_unfiltered += unfiltered_n
            click.echo(styles.status(
                f'Collected {total}/{total_unfiltered} tests.\r'),
                nl=False, err=list_tests)
    else:
        _update_progress = None

    test_loader = loader.TestLoader(
        verbosity=verbosity, exclude=exclude, include=include,
        progress_cb=_update_progress)

    for file in files:
        if not os.path.exists(file) and verbosity > 0:
            click.echo(styles.warning(
                f'Warning: {file}: no such file or directory.'))

        if os.path.isdir(file):
            tests = test_loader.discover(file)
        else:
            tests = test_loader.discover(
                os.path.dirname(file),
                pattern=os.path.basename(file))

        suite.addTest(tests)

    if list_tests:
        click.echo(err=True)
        cases = get_test_cases([suite])
        for tests in cases.values():
            for test in tests:
                click.echo(str(test))
        return 0

    jobs = max(min(total, jobs), 1)

    if verbosity > 0:
        click.echo()
        if jobs > 1:
            click.echo(styles.status(
                f'Using up to {jobs} processes to run tests.'))

    for rnum in range(repeat):
        if repeat > 1:
            click.echo(styles.status(
                f'Repeat #{rnum + 1} out of {repeat}.'))

        test_runner = runner.ParallelTextTestRunner(
            verbosity=verbosity, output_format=output_format,
            warnings=warnings, num_workers=jobs,
            failfast=failfast, shuffle=shuffle)

        result = test_runner.run(
            suite, selected_shard, total_shards, running_times_log_file,
        )

        if not result.wasSuccessful():
            return 1

    return 0
コード例 #3
0
 def run(self, test):
     self.cases.update(tb.get_test_cases([test]))
     return TestResult()
コード例 #4
0
    def run(self, test, selected_shard, total_shards, running_times_log_file):
        session_start = time.monotonic()
        cases = tb.get_test_cases([test])
        stats = {}
        if running_times_log_file:
            running_times_log_file.seek(0)
            stats = {
                k: (float(v), int(c))
                for k, v, c in csv.reader(running_times_log_file)
            }
        cases = tb.get_cases_by_shard(
            cases,
            selected_shard,
            total_shards,
            self.verbosity,
            stats,
        )
        setup = tb.get_test_cases_setup(cases)
        bootstrap_time_taken = 0
        tests_time_taken = 0
        result = None
        cluster = None
        conn = None
        setup_stats = []

        try:
            if setup:
                if self.verbosity >= 1:
                    self._echo(
                        'Populating test databases... ',
                        fg='white',
                        nl=False,
                    )

                if self.verbosity > 1:
                    self._echo(
                        '\n -> Bootstrapping EdgeDB instance...',
                        fg='white',
                        nl=False,
                    )

                cluster = tb._init_cluster(postgres_dsn=self.postgres_dsn,
                                           cleanup_atexit=False)

                if self.verbosity > 1:
                    self._echo(' OK')

                conn = cluster.get_connect_args()
                setup_stats = tb.setup_test_cases(
                    cases,
                    conn,
                    self.num_workers,
                    verbose=self.verbosity > 1,
                )

                os.environ.update({'EDGEDB_TEST_CASES_SET_UP': "1"})

                bootstrap_time_taken = time.monotonic() - session_start

                if self.verbosity >= 1:
                    self._echo('OK')

            start = time.monotonic()

            all_tests = list(
                itertools.chain.from_iterable(tests
                                              for tests in cases.values()))

            if self.num_workers > 1:
                suite = ParallelTestSuite(
                    self._sort_tests(cases),
                    conn,
                    self.num_workers,
                    self.postgres_dsn,
                )
            else:
                suite = SequentialTestSuite(
                    self._sort_tests(cases),
                    conn,
                    self.postgres_dsn,
                )

            result = ParallelTextTestResult(stream=self.stream,
                                            verbosity=self.verbosity,
                                            warnings=self.warnings,
                                            failfast=self.failfast,
                                            output_format=self.output_format,
                                            tests=all_tests,
                                            suite=suite)
            unittest.signals.registerResult(result)

            self._echo()
            suite.run(result)

            if running_times_log_file:
                for test, stat in result.test_stats + setup_stats:
                    name = str(test)
                    t = stat['running-time']
                    at, c = stats.get(name, (0, 0))
                    stats[name] = (at + (t - at) / (c + 1), c + 1)
                running_times_log_file.seek(0)
                running_times_log_file.truncate()
                writer = csv.writer(running_times_log_file)
                for k, v in stats.items():
                    writer.writerow((k, ) + v)
            tests_time_taken = time.monotonic() - start

        except KeyboardInterrupt:
            raise

        finally:
            if self.verbosity == 1:
                self._echo()

            if setup:
                self._echo()
                self._echo('Shutting down test cluster... ', nl=False)
                tb._shutdown_cluster(cluster, destroy=True)
                self._echo('OK.')

        if result is not None:
            self._render_result(result, bootstrap_time_taken, tests_time_taken)

        return result