Opened 7 months ago
Last modified 7 months ago
#36327 closed New feature
Improve TestCase.assertNumQueries() to allow for multiple databases — at Initial Version
| Reported by: | Javier Buzzi | Owned by: | |
|---|---|---|---|
| Component: | Testing framework | Version: | dev |
| Severity: | Normal | Keywords: | query count testcase assertNumQueries |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Relevant discussions:
- https://forum.djangoproject.com/t/add-ability-to-capture-all-the-db-queries-at-once-during-tests/39650
- https://github.com/pytest-dev/pytest-django/pull/1177
The goal is to enhance the behavior of TestCase.assertNumQueries(). In large Django projects, the data structure is often split into multiple databases—for example, one for user data, another for business data, one for events, and even a dedicated one for certain monetary compliance logs. As a result, tests may need to validate query counts across several databases. For instance, you might have code that looks like this:
class TestThing(TestCase):
databases = {"db1", "db2", "db3", "db4"}
def test_thing(self):
with self.assertNumQueries(4, using="db1"), self.assertNumQueries(0, using="db2"), self.assertNumQueries(1, using="db3"), self.assertNumQueries(0, using="db4"):
thing()
The desired improvement is to simplify this syntax. Instead of writing a separate context manager for each database, you could pass multiple databases at once. For example:
class TestThing(TestCase):
databases = {"db1", "db2", "db3", "db4"}
def test_thing(self):
with self.assertNumQueries(5, using={"db1", "db2", "db3", "db4"}):
thing()
Alternatively, you might be able to use a special keyword like __all__ to achieve the same effect:
with self.assertNumQueries(5, using="__all__"):
...
This approach not only makes the test code more manageable but also helps improve clarity by consolidating query count assertions across all databases.