Opened 5 years ago
Last modified 5 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 mysql
backend.
How to reproduce the error:
- Start a new project and apply django migrations
- Change database backend to
django.db.backends.mysql
- Create a new user by running
./manage.py createsuperuser
- 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