Пример #1
0
    def __init__(self, project, full_test_name):
        suite, test_name = parse_name(full_test_name)
        self.test = full_test_name

        tests = Test.objects.filter(
            suite__slug=suite,
            name=test_name,
            test_run__build__project=project,
        )
        Test.prefetch_related(tests)

        environments = OrderedDict()
        results = OrderedDict()
        for build in project.builds.reverse():
            results[build] = {}

        for test in tests:
            build = test.test_run.build
            environment = test.test_run.environment

            environments[environment] = True
            results[build][environment] = TestResult(test)

        self.environments = list(environments.keys())
        self.results = results
Пример #2
0
    def __init__(self, project, full_test_name, top=None, page=1, per_page=20):
        suite_slug, test_name = parse_name(full_test_name)
        self.test = full_test_name

        self.paginator = Paginator(project.builds.prefetch_related(Prefetch('test_runs', queryset=TestRun.objects.prefetch_related('environment').all())).reverse(), per_page)
        if top:
            self.number = 0
            builds = project.builds.filter(datetime__lte=top.datetime).reverse()[0:per_page - 1]
        else:
            self.number = page
            builds = self.paginator.page(page)

        self.top = builds[0]

        environments = OrderedDict()
        results = OrderedDict()
        for build in builds:
            results[build] = {}

        issues_by_env = {}
        for issue in KnownIssue.active_by_project_and_test(project, full_test_name).all():
            for env in issue.environments.all():
                if env.id not in issues_by_env:
                    issues_by_env[env.id] = []
                issues_by_env[env.id].append(issue)

        suite = project.suites.prefetch_related('metadata').get(slug=suite_slug)
        metadata = SuiteMetadata.objects.get(kind='test', suite=suite_slug, name=test_name)
        tests = Test.objects.filter(build__in=builds, metadata_id=metadata.id).prefetch_related('build', 'environment', 'test_run', 'metadata').order_by()
        all_envs = set(project.environments.all())
        for test in tests:
            build = test.build
            environment = test.environment
            environments[environment] = True
            known_issues = issues_by_env.get(environment.id)
            is_duplicate = False
            if environment in results[build]:
                is_duplicate = True
            results[build][environment] = TestResult(test, suite, metadata, known_issues, is_duplicate)

        for build in results.keys():
            recorded_envs = set(results[build].keys())
            remaining_envs = all_envs - recorded_envs
            for env in remaining_envs:
                results[build][env] = None
                environments[env] = True
        # Make sure all builds that don't have the test have None at least
        for b in builds:
            if not results[b]:
                for env in all_envs:
                    results[build][env] = None
                    environments[env] = True

        self.environments = sorted(environments.keys(), key=lambda env: env.slug)
        self.results = results
Пример #3
0
 def regressions_grouped_by_suite(self):
     regressions = self.regressions
     result = OrderedDict()
     for env, tests in regressions.items():
         this_env = OrderedDict()
         for test in tests:
             suite, testname = parse_name(test)
             if suite not in this_env:
                 this_env[suite] = []
             this_env[suite].append(testname)
         result[env] = this_env
     return result
Пример #4
0
    def __call__(test_data):
        if test_data is None or test_data == '':
            return []

        input_data = json.loads(test_data)
        data = []
        for key, value in input_data.items():
            group_name, test_name = parse_name(key)
            data.append({
                "group_name": group_name,
                "test_name": test_name,
                "pass": parse_test_result(value),
            })
        return data
Пример #5
0
 def __status_changes_by_suite__(self, regression=True):
     comparisons = self.regressions
     if not regression:
         comparisons = self.fixes
     result = OrderedDict()
     for env, tests in comparisons.items():
         this_env = OrderedDict()
         for test in tests:
             suite, testname = parse_name(test)
             if suite not in this_env:
                 this_env[suite] = []
             this_env[suite].append(testname)
         result[env] = this_env
     return result
Пример #6
0
    def __call__(test_data):
        if test_data is None or test_data == '':
            return []

        input_data = json.loads(test_data)
        data = []
        for key, value in input_data.items():
            group_name, test_name = parse_name(key)
            data.append({
                "group_name": group_name,
                "test_name": test_name,
                "pass": parse_test_result(value),
            })
        return data
 def __status_changes_by_suite__(self, regression=True):
     comparisons = self.regressions
     if not regression:
         comparisons = self.fixes
     result = OrderedDict()
     for env, tests in comparisons.items():
         this_env = OrderedDict()
         for test in tests:
             suite, testname = parse_name(test)
             if suite not in this_env:
                 this_env[suite] = []
             this_env[suite].append(testname)
         result[env] = this_env
     return result
Пример #8
0
 def __status_changes_by_suite__(self, regression=True):
     comparisons = self.__regressions__
     if not regression:
         comparisons = self.__fixes__
     result = OrderedDict()
     for env, items in comparisons.items():
         this_env = OrderedDict()
         for item in items:
             suite, itemname = parse_name(item)
             if suite not in this_env:
                 this_env[suite] = []
             this_env[suite].append(itemname)
         result[env] = this_env
     return result
Пример #9
0
def get_dynamic_summary(project, environments, metrics, date_start, date_end):
    entry = {}
    filters = []
    if not metrics:
        for env in environments:
            entry[env] = []
        return entry
    for m in metrics:
        suite, metric = parse_name(m)
        filters.append(Q(suite__slug=suite) & Q(name=metric))
    metric_filter = reduce(lambda x, y: x | y, filters)

    data = models.Metric.objects.filter(
        test_run__build__project=project,
        test_run__environment__slug__in=environments,
        test_run__created_at__range=(date_start, date_end),
    ).filter(metric_filter).prefetch_related(
        'test_run',
        'test_run__environment',
        'test_run__build',
        'test_run__build__annotation',
    ).order_by('test_run__environment__id', 'test_run__build__id')

    for environment, metrics_by_environment in groupby(
            data, lambda m: m.test_run.environment):
        envdata = []
        metrics_by_build = groupby(metrics_by_environment,
                                   lambda m: m.test_run.build)
        for build, metric_list in metrics_by_build:
            values = []
            for metric in metric_list:
                if not metric.is_outlier:
                    values = values + metric.measurement_list
            try:
                description = build.annotation.description
            except ObjectDoesNotExist:
                description = ""
            envdata.append([
                build.datetime.timestamp(),
                geomean(values),
                build.version,
                description,
            ])
        entry[environment.slug] = sorted(envdata, key=(lambda e: e[0]))

    return entry
Пример #10
0
    def __call__(json_text):
        if json_text is None or json_text == '':
            return []

        input_data = json.loads(json_text)
        data = []

        for key, value in input_data.items():
            group_name, name = parse_name(key)
            result, measurements = parse_metric(value)
            if result is not None and not (math.isnan(result) or math.isinf(result)):
                data.append({
                    "name": name,
                    "group_name": group_name,
                    "result": result,
                    "measurements": measurements,
                })

        return data
Пример #11
0
    def __call__(json_text):
        if json_text is None or json_text == '':
            return []

        input_data = json.loads(json_text)
        data = []

        for key, value in input_data.items():
            group_name, name = parse_name(key)
            result, measurements = parse_metric(value)
            if result is not None and not (math.isnan(result) or math.isinf(result)):
                data.append({
                    "name": name,
                    "group_name": group_name,
                    "result": result,
                    "measurements": measurements,
                })

        return data
Пример #12
0
    def __call__(test_data):
        if test_data is None or test_data == '':
            return []

        input_data = json.loads(test_data)
        data = []
        for key, value in input_data.items():
            group_name, test_name = parse_name(key)
            result = value
            log = None
            if isinstance(value, dict):
                result = value.get('result', None)
                log = value.get('log', None)
            data.append({
                "group_name": group_name,
                "test_name": test_name,
                "pass": parse_test_result(result),
                "log": log
            })
        return data
Пример #13
0
    def __init__(self, project, full_test_name, top=None, page=1, per_page=20):
        suite, test_name = parse_name(full_test_name)
        self.test = full_test_name

        self.paginator = Paginator(project.builds.reverse(), per_page)
        if top:
            self.number = 0
            builds = project.builds.filter(
                datetime__lte=top.datetime).reverse()[0:per_page - 1]
        else:
            self.number = page
            builds = self.paginator.page(page)

        suite = project.suites.get(slug=suite)

        tests = Test.objects.filter(
            suite=suite,
            name=test_name,
            test_run__build__in=builds,
        )
        Test.prefetch_related(tests)

        environments = OrderedDict()
        results = OrderedDict()
        for build in builds:
            results[build] = {}
        self.top = builds[0]

        for test in tests:
            build = test.test_run.build
            environment = test.test_run.environment

            environments[environment] = True
            results[build][environment] = TestResult(test)

        self.environments = sorted(environments.keys(),
                                   key=lambda env: env.slug)
        self.results = results
Пример #14
0
    def __call__(json_text):
        if json_text is None or json_text == '':
            return []

        input_data = json.loads(json_text)
        data = []
        for metric, value_dict in input_data.items():
            unit = None
            if type(value_dict) is dict:
                unit = value_dict.get('unit', None)
                value = value_dict.get('value', None)
            else:
                value = value_dict
            group_name, name = parse_name(metric)
            result, measurements = parse_metric(value)
            if result is not None and not (math.isnan(result) or math.isinf(result)):
                data.append({
                    "name": name,
                    "group_name": group_name,
                    "result": result,
                    "measurements": measurements,
                    "unit": unit,
                })
        return data
Пример #15
0
    def __init__(self, project, full_test_name, top=None, page=1, per_page=20):
        suite, test_name = parse_name(full_test_name)
        self.test = full_test_name

        self.paginator = Paginator(project.builds.reverse(), per_page)
        if top:
            self.number = 0
            builds = project.builds.filter(datetime__lte=top.datetime).reverse()[0:per_page - 1]
        else:
            self.number = page
            builds = self.paginator.page(page)

        suite = project.suites.get(slug=suite)

        tests = Test.objects.filter(
            suite=suite,
            name=test_name,
            test_run__build__in=builds,
        )
        Test.prefetch_related(tests)

        environments = OrderedDict()
        results = OrderedDict()
        for build in builds:
            results[build] = {}
        self.top = builds[0]

        for test in tests:
            build = test.test_run.build
            environment = test.test_run.environment

            environments[environment] = True
            results[build][environment] = TestResult(test)

        self.environments = sorted(environments.keys(), key=lambda env: env.slug)
        self.results = results
Пример #16
0
 def test_nested(self):
     self.assertEqual(('foo/bar', 'baz'), parse_name('foo/bar/baz'))
Пример #17
0
 def test_simple(self):
     self.assertEqual(('foo', 'bar'), parse_name('foo/bar'))
Пример #18
0
 def test_variants_missing_opening_bracket(self):
     self.assertEqual(('long/special/case.forresult', 'variants]'),
                      parse_name("long/special/case.forresult/variants]"))
Пример #19
0
 def test_nested(self):
     self.assertEqual(('foo/bar', 'baz'), parse_name('foo/bar/baz'))
Пример #20
0
 def test_variants_simple(self):
     self.assertEqual(('special', 'case.for[result/variants]'),
                      parse_name("special/case.for[result/variants]"))
Пример #21
0
 def test_variants_simple(self):
     self.assertEqual(('special', 'case.for[result/variants]'),
                      parse_name("special/case.for[result/variants]"))
Пример #22
0
 def test_multiple_leading_slashes(self):
     self.assertEqual(('/', 'foo'), parse_name('//foo'))
Пример #23
0
 def test_multiple_leading_slashes(self):
     self.assertEqual(('/', 'foo'), parse_name('//foo'))
Пример #24
0
 def test_variants_nested(self):
     self.assertEqual(('long/special', 'case.for[result/variants]'),
                      parse_name("long/special/case.for[result/variants]"))
Пример #25
0
 def test_variants_missing_opening_bracket(self):
     self.assertEqual(('long/special/case.forresult', 'variants]'),
                      parse_name("long/special/case.forresult/variants]"))
Пример #26
0
 def test_simple(self):
     self.assertEqual(('foo', 'bar'), parse_name('foo/bar'))
Пример #27
0
 def test_variants_multiple_leading_slashes(self):
     self.assertEqual(('/', 'case.for[result/variants]'),
                      parse_name("//case.for[result/variants]"))
Пример #28
0
 def test_variants_ungrouped(self):
     self.assertEqual(('/', 'case.for[result/variants]'),
                      parse_name("case.for[result/variants]"))
Пример #29
0
 def test_variants_multiple_leading_slashes(self):
     self.assertEqual(('/', 'case.for[result/variants]'),
                      parse_name("//case.for[result/variants]"))
Пример #30
0
 def test_variants_ungrouped(self):
     self.assertEqual(('/', 'case.for[result/variants]'),
                      parse_name("case.for[result/variants]"))
Пример #31
0
 def test_variants_nested(self):
     self.assertEqual(('long/special', 'case.for[result/variants]'),
                      parse_name("long/special/case.for[result/variants]"))
Пример #32
0
 def by_full_name(self, name):
     (suite, metric) = parse_name(name)
     return self.filter(suite__slug=suite, name=metric)
Пример #33
0
 def by_full_name(self, name):
     (suite, metric) = parse_name(name)
     return self.filter(suite__slug=suite, name=metric)
Пример #34
0
 def test_ungrouped(self):
     self.assertEqual(('/', 'foo'), parse_name('foo'))
Пример #35
0
 def test_ungrouped(self):
     self.assertEqual(('/', 'foo'), parse_name('foo'))