Opened 4 years ago

Last modified 4 years ago

#31414 closed Bug

Django TestCase reads from "production" database with MySQL backend — at Initial Version

Reported by: Danilo Favato Owned by: nobody
Component: Testing framework Version: 3.0
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

The [Django documentation](https://docs.djangoproject.com/en/3.0/topics/testing/overview/#the-test-database) states that:

Finding data from your production database when running tests?
If your code attempts to access the database when its modules are compiled, this will occur before the test database is set up, with potentially unexpected results. For example, if you have a database query in module-level code and a real database exists, production data could pollute your tests.

However, the above mentioned behavior can occur in a brand new Django project using mysqlbackend.

How to reproduce the error:

  1. Start a new project and apply django migrations
  2. Change database backend to django.db.backends.mysql
  3. Create a new user by running ./manage.py createsuperuser
  4. Add the following test module to the project

Code highlighting:

# test.py
from django.test import TestCase
from django.contrib.auth.models import User

class TestUserCount(TestCase):
  def test_empty_db(self):
      self.assertEqual(0, User.objects.count())

The test above fails with AssertionError: 0 != 1 but passes if you use a sqlite backend.

Environment:

  • Python 3.8.1
  • Django 3.0.4
  • mysqlclient 1.4.6
  • MariaDB 10.4.12

Change History (0)

Note: See TracTickets for help on using tickets.
Back to Top