Opened 5 months ago

Last modified 5 months ago

#36327 closed New feature

Improve TestCase.assertNumQueries() to allow for multiple databases — at Version 1

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 (last modified by Javier Buzzi)

PR 19380

Relevant discussions:

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.

Change History (1)

comment:1 by Javier Buzzi, 5 months ago

Description: modified (diff)
Has patch: set
Note: See TracTickets for help on using tickets.
Back to Top