DEV Community

Daniel Medina
Daniel Medina

Posted on

3 2

My findings for a pytest-django warning - Error when trying to teardown test databases

Background

I found myself having a bit of free time on Friday the 5th so I thought it would be helpful to my team to try and decrease the amount of warnings we received after running tox and having all tests pass.

Here was my environment:

Ubuntu - 20.04 LTS
django - 3.2.8
pytest - 6.2.5
pytest-django - 4.4.0
tox - 3.24.4

Warning and Resolution

I received a very strange / obscure warning whenever test databases would be torn down. The warning in full was:

Error when trying to teardown test databases: TypeError('object.__new__() takes exactly one argument (the type to instantiate)')

I ended up resolving this warning by:

  1. Navigating to my pytest.ini file in my base directory.
  2. On the addopts line, adding two switches to the end: --reuse-db --create-db .

The final version of this line looked like this:

[pytest]
// some other settings
addopts = [additional options here] --reuse-db --create-db 
Enter fullscreen mode Exit fullscreen mode

Findings

The source of this warning is from pytest-django's fixtures.py file. It can be found here on GitHub . The function being called is teardown_database which is defined on line 126.

According to pytest-django's official documentation, using the reuse-db and create-db switches together helps isolate and recreate databases throughout tests.

--reuse-db will not pick up schema changes between test runs. You must run the tests with --reuse-db --create-db to re-create the database according to the new schema. Running without --reuse-db is also possible, since the database will automatically be re-created.

(source: pytest-django docs)

My guess is that somewhere during the tests, not all of the test databases are properly created. This would result in pytest-django trying to tear down something that isn't there. This would also explain why it is looking for an object that can't be used when it is calling teardown_database .

Finally, in my time spent searching for a solution, I found some similar pages online. While they weren't directly related to my problem and solution, they may be helpful in forming a trail of breadcrumbs towards solving a different problem:

SO - Why is pytest throwing an "Attribute Error: 'NoneType' object has no attribute..."
GitHub - Ignoring migrations during Django testing (unmanaged databases, legacy databases, etc)

References and Special Thanks

I want to specifically thank Cris Ewing for their article on Medium . I relied heavily on their troubleshooting and debugging methodology. Without their post, I would never have found a solution or experimented using ideas from the official pytest-django documentation. Thank you Cris!

I also wish to thank Stefaan Lippens for their short blog post on how to disable PyTest's default log capturing. It was very useful as I was debugging. It can be found here .

References:

pytest-django documentation --reuse-db reuse the test database between runs
pytest-django source code

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs