Tests / apps/projects/tests.py
SlugsAndNumbersTest::test_runs_and_profiles_are_numbered_per_project
First seen 3 weeks ago in 78a4357
CI
github-actions:test
12 runs
Average
16 ms
median 18 ms
max 20 ms
max 20 ms
Phases
Setup 0.66 ms
Call 15 ms
Teardown 0.15 ms
Categories
Database 13 ms
Factories 1 ms
App code 0.10 ms
Other (Unsampled, pytest, Deep copies, Libraries) 2 ms
23 database queries per run
Needs 0 KB of memory (max 4 KB)
Duration per run
Where the time goes
Latest run in ci:github-actions:test, 16 hours ago ·
open run
setup0.65 ms4.0%
call16 ms94.9%
SlugsAndNumbersTest.test_runs_and_profiles_are_numbered_per_projectapps/projects/tests.py:1489 self.assertEqual([baker.make(Run, project=self.project, ingest=ingest).number for _ in range(2)], [1, 2])3 ms21.1%
makemodel_bakery/baker.py:1473 ms21.1%
Baker.makemodel_bakery/baker.py:4063 ms21.1%
Baker._makemodel_bakery/baker.py:4822 ms10.5%
Baker.instancemodel_bakery/baker.py:5352 ms10.5%
Run.saveapps/projects/models.py:1872 ms10.5%
next_numberapps/projects/models.py:35 return (model.objects.filter(project_id=project_id).aggregate(last=models.Max("number"))["last"] or 0) + 12 ms10.5%
QuerySet.aggregatedjango/db/models/query.py:5942 ms10.5%
Query.get_aggregationdjango/db/models/sql/query.py:6332 ms10.5%
SQLCompiler.execute_sqldjango/db/models/sql/compiler.py:16242 ms10.5%
CursorWrapper.executedjango/db/backends/utils.py:792 ms10.5%
CursorWrapper._execute_with_wrappersdjango/db/backends/utils.py:922 ms10.5%
CursorWrapper._executedjango/db/backends/utils.py:1052 ms10.5%
Cursor.executepsycopg/cursor.py:1132 ms10.5%
Connection.waitpsycopg/connection.py:4952 ms10.5%
Baker._makemodel_bakery/baker.py:4422 ms10.5%
Baker.get_fieldsmodel_bakery/baker.py:4242 ms10.5%
SlugsAndNumbersTest.test_runs_and_profiles_are_numbered_per_projectapps/projects/tests.py:14913 ms21.1%
get_or_create_numberedapps/projects/models.py:18 existing = model.objects.filter(project=project, **lookup).first()2 ms10.5%
QuerySet.firstdjango/db/models/query.py:11452 ms10.5%
QuerySet.__iter__django/db/models/query.py:3902 ms10.5%
QuerySet._fetch_alldjango/db/models/query.py:20002 ms10.5%
ModelIterable.__iter__django/db/models/query.py:952 ms10.5%
SQLCompiler.execute_sqldjango/db/models/sql/compiler.py:16242 ms10.5%
CursorWrapper.executedjango/db/backends/utils.py:792 ms10.5%
CursorWrapper._execute_with_wrappersdjango/db/backends/utils.py:922 ms10.5%
CursorWrapper._executedjango/db/backends/utils.py:1052 ms10.5%
Cursor.executepsycopg/cursor.py:1132 ms10.5%
Connection.waitpsycopg/connection.py:4952 ms10.5%
get_or_create_numberedapps/projects/models.py:24 return model.objects.create(project=project, number=number, **lookup, **(defaults or {})), True2 ms10.5%
BaseManager._get_queryset_methods.<locals>.create_method.<locals>.manager_methoddjango/db/models/manager.py:872 ms10.5%
QuerySet.createdjango/db/models/query.py:6692 ms10.5%
Profile.saveapps/projects/models.py:466 super().save(*args, **kwargs)2 ms10.5%
Model.savedjango/db/models/base.py:8742 ms10.5%
Model.save_basedjango/db/models/base.py:9662 ms10.5%
Model._save_tabledjango/db/models/base.py:11672 ms10.5%
Model._do_insertdjango/db/models/base.py:12182 ms10.5%
BaseManager._get_queryset_methods.<locals>.create_method.<locals>.manager_methoddjango/db/models/manager.py:872 ms10.5%
QuerySet._insertdjango/db/models/query.py:19182 ms10.5%
SQLInsertCompiler.execute_sqldjango/db/models/sql/compiler.py:19252 ms10.5%
CursorWrapper.executedjango/db/backends/utils.py:792 ms10.5%
CursorWrapper._execute_with_wrappersdjango/db/backends/utils.py:922 ms10.5%
CursorWrapper._executedjango/db/backends/utils.py:1052 ms10.5%
Cursor.executepsycopg/cursor.py:1132 ms10.5%
Connection.waitpsycopg/connection.py:4952 ms10.5%
SlugsAndNumbersTest.test_runs_and_profiles_are_numbered_per_projectapps/projects/tests.py:14953 ms21.1%
get_or_create_numberedapps/projects/models.py:212 ms10.5%
next_numberapps/projects/models.py:35 return (model.objects.filter(project_id=project_id).aggregate(last=models.Max("number"))["last"] or 0) + 12 ms10.5%
QuerySet.aggregatedjango/db/models/query.py:5942 ms10.5%
Query.get_aggregationdjango/db/models/sql/query.py:6332 ms10.5%
SQLCompiler.execute_sqldjango/db/models/sql/compiler.py:16242 ms10.5%
CursorWrapper.executedjango/db/backends/utils.py:792 ms10.5%
CursorWrapper._execute_with_wrappersdjango/db/backends/utils.py:922 ms10.5%
CursorWrapper._executedjango/db/backends/utils.py:1052 ms10.5%
Cursor.executepsycopg/cursor.py:1132 ms10.5%
Connection.waitpsycopg/connection.py:4952 ms10.5%
get_or_create_numberedapps/projects/models.py:24 return model.objects.create(project=project, number=number, **lookup, **(defaults or {})), True2 ms10.5%
BaseManager._get_queryset_methods.<locals>.create_method.<locals>.manager_methoddjango/db/models/manager.py:872 ms10.5%
QuerySet.createdjango/db/models/query.py:6692 ms10.5%
Profile.saveapps/projects/models.py:466 super().save(*args, **kwargs)2 ms10.5%
Model.savedjango/db/models/base.py:8742 ms10.5%
Model.save_basedjango/db/models/base.py:9662 ms10.5%
Model._save_tabledjango/db/models/base.py:11672 ms10.5%
Model._do_insertdjango/db/models/base.py:12182 ms10.5%
BaseManager._get_queryset_methods.<locals>.create_method.<locals>.manager_methoddjango/db/models/manager.py:872 ms10.5%
QuerySet._insertdjango/db/models/query.py:19182 ms10.5%
SQLInsertCompiler.execute_sqldjango/db/models/sql/compiler.py:19252 ms10.5%
CursorWrapper.executedjango/db/backends/utils.py:792 ms10.5%
CursorWrapper._execute_with_wrappersdjango/db/backends/utils.py:922 ms10.5%
CursorWrapper._executedjango/db/backends/utils.py:1052 ms10.5%
Cursor.executepsycopg/cursor.py:1132 ms10.5%
Connection.waitpsycopg/connection.py:4952 ms10.5%
TransactionTestCase._post_teardowndjango/test/testcases.py:1240 self._fixture_teardown()3 ms21.1%
TestCase._fixture_teardowndjango/test/testcases.py:14952 ms10.5%
DatabaseWrapper.check_constraintsdjango/db/backends/postgresql/base.py:4832 ms10.5%
CursorWrapper.executedjango/db/backends/utils.py:792 ms10.5%
CursorWrapper._execute_with_wrappersdjango/db/backends/utils.py:922 ms10.5%
CursorWrapper._executedjango/db/backends/utils.py:1032 ms10.5%
Cursor.executepsycopg/cursor.py:1132 ms10.5%
Connection.waitpsycopg/connection.py:4952 ms10.5%
BaseCursor._execute_genpsycopg/_cursor_base.py:2062 ms10.5%
BaseCursor._maybe_prepare_genpsycopg/_cursor_base.py:2862 ms10.5%
ClientCursorMixin._execute_sendpsycopg/client_cursor.py:782 ms10.5%
TestCase._fixture_teardowndjango/test/testcases.py:14972 ms10.5%
TestCase._rollback_atomicsdjango/test/testcases.py:14052 ms10.5%
Atomic.__exit__django/db/transaction.py:2832 ms10.5%
async_unsafe.<locals>.decorator.<locals>.innerdjango/utils/asyncio.py:262 ms10.5%
BaseDatabaseWrapper.savepoint_rollbackdjango/db/backends/base/base.py:4132 ms10.5%
BaseDatabaseWrapper._savepoint_rollbackdjango/db/backends/base/base.py:3712 ms10.5%
CursorWrapper.executedjango/db/backends/utils.py:792 ms10.5%
CursorWrapper._execute_with_wrappersdjango/db/backends/utils.py:922 ms10.5%
CursorWrapper._executedjango/db/backends/utils.py:1032 ms10.5%
Cursor.executepsycopg/cursor.py:1132 ms10.5%
Connection.waitpsycopg/connection.py:4952 ms10.5%
SlugsAndNumbersTest.test_runs_and_profiles_are_numbered_per_projectapps/projects/tests.py:1494 Profile.objects.filter(pk=profile.pk).update(number=5)2 ms10.5%
QuerySet.updatedjango/db/models/query.py:13002 ms10.5%
SQLUpdateCompiler.execute_sqldjango/db/models/sql/compiler.py:21112 ms10.5%
SQLCompiler.execute_sqldjango/db/models/sql/compiler.py:16242 ms10.5%
CursorWrapper.executedjango/db/backends/utils.py:792 ms10.5%
CursorWrapper._execute_with_wrappersdjango/db/backends/utils.py:922 ms10.5%
CursorWrapper._executedjango/db/backends/utils.py:1052 ms10.5%
Cursor.executepsycopg/cursor.py:1132 ms10.5%
Connection.waitpsycopg/connection.py:4952 ms10.5%
Estimated from 10 samples; phase durations are exact. Frames from pytest and pluggy are
hidden
.
Hot lines in your code
|
apps/projects/models.py:35
return (model.objects.filter(project_id=project_id).aggregate(last=models.Max("number"))["last"] or 0) + 1
next_number
· Database
|
3 ms |
|
apps/projects/models.py:466
super().save(*args, **kwargs)
Profile.save
· Database
|
3 ms |
|
apps/projects/tests.py:1489
self.assertEqual([baker.make(Run, project=self.project, ingest=ingest).number for _ in range(2)], [1, 2])
SlugsAndNumbersTest.test_runs_and_profiles_are_numbered_per_project
· Factories
|
2 ms |
|
apps/projects/models.py:18
existing = model.objects.filter(project=project, **lookup).first()
get_or_create_numbered
· Database
|
2 ms |
|
apps/projects/tests.py:1494
Profile.objects.filter(pk=profile.pk).update(number=5)
SlugsAndNumbersTest.test_runs_and_profiles_are_numbered_per_project
· Database
|
2 ms |
Fixtures
Exact setup time| _dj_autoclear_mailbox function | 0.05 ms |
| _django_db_marker function | 0.04 ms |
| _template_string_if_invalid_marker function | 0.04 ms |
| _live_server_helper function | 0.03 ms |
| _django_set_urlconf function | 0.03 ms |
| _django_clear_site_cache function | 0.03 ms |
| monkeypatch function | 0.02 ms |
Database
23 queries · 8 ms
Repeated queries are usually N+1 lookups: fetch them once with select_related / prefetch_related (or selectinload).
3×
SELECT MAX("projects_run"."number") AS "last" FROM "projects_run" WHERE "projects_run"."project_id" = %s
3×
INSERT INTO "projects_run" ("project_id", "number", "external_id", "attempt", "status", "date_created", "date_finished", "commit_id", "ingest_id") VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) RETURNING "projects_run"."id"
Biggest pieces of work
|
call test body
apps/projects/tests.py:1489
|
12 ms |
|
call _post_teardown
django/test/testcases.py:1240
|
3 ms |
| setup pytest internals | 0.65 ms |
Reliability
12 results · 0 CI failures · 0 local failuresThis test hasn't failed recently.
History
Latest 12 results, oldest first in the strip| When | Environment | Outcome | Duration | |
|---|---|---|---|---|
| 16 hours ago | CI github-actions:test | passed | 17 ms | Profile |
| 1 week, 5 days ago | CI github-actions:test | passed | 11 ms | Profile |
| 2 weeks, 1 day ago | CI github-actions:test | passed | 17 ms | Profile |
| 2 weeks, 1 day ago | CI github-actions:test | passed | 14 ms | Profile |
| 2 weeks, 1 day ago | CI github-actions:test | passed | 18 ms | Profile |
| 2 weeks, 2 days ago | CI github-actions:test | passed | 12 ms | Profile |
| 2 weeks, 4 days ago | CI github-actions:test | passed | 19 ms | Profile |
| 2 weeks, 6 days ago | CI github-actions:test | passed | 18 ms | Profile |
| 2 weeks, 6 days ago | CI github-actions:test | passed | 18 ms | Profile |
| 3 weeks ago | CI github-actions:test | passed | 19 ms | Profile |
| 3 weeks ago | CI github-actions:test | passed | 12 ms | Profile |
| 3 weeks ago | CI github-actions:test | passed | 20 ms | Profile |