#36327: Improve TestCase.assertNumQueries() to allow for multiple databases
-------------------------------------+-------------------------------------
Reporter: Javier Buzzi | Owner: (none)
Type: New feature | Status: new
Component: Testing framework | Version: dev
Severity: Normal | Resolution:
Keywords: query count | Triage Stage:
testcase assertNumQueries | Unreviewed
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Javier Buzzi):
* has_patch: 0 => 1
Old 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.
New description:
[https://github.com/django/django/pull/19380 PR 19380]
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.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/36327#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/django-updates/0107019635134e48-ab9c21b4-70a3-40d9-ad12-d2f4c2915c38-000000%40eu-central-1.amazonses.com.