#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.

Reply via email to