Opened 5 months ago
Last modified 5 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.