Skip to content

Improve TestCase.assertNumQueries() to allow for multiple databases #103

Description

@knyghty

Imported from Trac ticket #36327, reported by Javier Buzzi on 2025-04-14. This repository is a migration demo, not Django's real tracker.
Assigned to: Javier Buzzi · Keywords: query count testcase assertNumQueries · Resolution: wontfix

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Fields

    Component

    Testing framework

    Triage stage

    Unreviewed

    Version

    dev

    Severity

    Normal

    Flags

    None yet

    Keywords

    query, count, testcase, assertNumQueries

    Projects

    Status
    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions