pytest-django helps you test Django apps easily. It makes writing and running tests simple and fast.
pytest-django for Django testing
Introduction
Syntax
PyTest
import pytest from django.urls import reverse @pytest.mark.django_db def test_view(client): url = reverse('home') response = client.get(url) assert response.status_code == 200
Use @pytest.mark.django_db to allow database access in tests.
The client fixture simulates a web browser for requests.
Examples
PyTest
import pytest @pytest.mark.django_db def test_model_count(): from myapp.models import Item count = Item.objects.count() assert count == 0
PyTest
import pytest from django.urls import reverse @pytest.mark.django_db def test_homepage(client): url = reverse('home') response = client.get(url) assert response.status_code == 200 assert b"Welcome" in response.content
Sample Program
This test checks that the 'about' page loads successfully and contains the text 'About Us'.
PyTest
import pytest from django.urls import reverse @pytest.mark.django_db def test_about_page(client): url = reverse('about') response = client.get(url) assert response.status_code == 200 assert b"About Us" in response.content
Important Notes
Always add @pytest.mark.django_db when your test uses the database.
Use Django's reverse() to get URLs by name, so tests stay clear and stable.
The client fixture is like a fake browser to test your views.
Summary
pytest-django makes testing Django apps easier by combining pytest with Django features.
Use @pytest.mark.django_db to access the database in tests.
The client fixture helps simulate user requests to your Django app.
Practice
1. What is the main purpose of using
@pytest.mark.django_db in pytest-django tests?easy
Solution
Step 1: Understand the role of
This marker tells pytest that the test needs database access, so pytest sets up the test database properly.@pytest.mark.django_dbStep 2: Identify what happens without the marker
Without this marker, tests cannot access or modify the database and will fail if they try.Final Answer:
To allow the test to access and modify the Django database -> Option DQuick Check:
Database access marker = B [OK]
Hint: Use @pytest.mark.django_db to enable DB access in tests [OK]
Common Mistakes:
- Thinking it skips tests instead of enabling DB access
- Confusing it with marking tests as slow
- Assuming it disables migrations
2. Which of the following is the correct way to use the Django test client fixture in pytest-django?
easy
Solution
Step 1: Check the function signature and usage
The test function must accept theclientfixture as a parameter to use it.Step 2: Verify the assertion syntax
The assertion must use==to compareresponse.status_codeto 200.Final Answer:
def test_view(client): response = client.get('/'); assert response.status_code == 200 -> Option AQuick Check:
Correct fixture use and assertion = C [OK]
Hint: Pass client as parameter and use response.status_code == 200 [OK]
Common Mistakes:
- Not passing client as a parameter
- Using single = instead of == in assertion
- Checking response.status instead of response.status_code
3. Given the following test code using pytest-django, what will be the output when running the test?
import pytest
from django.contrib.auth.models import User
@pytest.mark.django_db
def test_user_count():
User.objects.create(username='alice')
User.objects.create(username='bob')
count = User.objects.count()
assert count == 2
print(count)medium
Solution
Step 1: Analyze database access and object creation
The test uses@pytest.mark.django_db, so it can create User objects in the test database.Step 2: Count the User objects and assert
Two users are created, soUser.objects.count()returns 2, matching the assertion.Final Answer:
Test passes and prints 2 -> Option BQuick Check:
User count = 2 [OK]
Hint: Mark test with django_db to create and count users correctly [OK]
Common Mistakes:
- Forgetting @pytest.mark.django_db causes DB errors
- Assuming count is zero without creation
- Confusing print output with test result
4. Identify the error in this pytest-django test code and how to fix it:
def test_create_user():
User.objects.create(username='charlie')
assert User.objects.count() == 1medium
Solution
Step 1: Check database access requirement
The test tries to create a User in the database but lacks@pytest.mark.django_db, so DB access is not allowed.Step 2: Fix by adding the missing decorator
Adding@pytest.mark.django_dbabove the test function enables database access and fixes the error.Final Answer:
Missing @pytest.mark.django_db decorator to allow DB access -> Option CQuick Check:
DB access decorator missing = D [OK]
Hint: Add @pytest.mark.django_db to tests using the database [OK]
Common Mistakes:
- Not adding the django_db marker
- Assuming import errors without checking imports
- Misunderstanding assertion values
5. You want to test a Django view that requires a logged-in user using pytest-django. Which is the best way to simulate a logged-in user in your test?
hard
Solution
Step 1: Understand how to simulate login in pytest-django
Theclient.force_login(user)method logs in the user for the test client session.Step 2: Create a user in the test database first
You must create a user in the test database (with@pytest.mark.django_db) before callingforce_login.Final Answer:
Use the client.force_login(user) method after creating a user in the test database -> Option AQuick Check:
Use force_login with created user = A [OK]
Hint: Create user and call client.force_login(user) to simulate login [OK]
Common Mistakes:
- Trying to set session manually without user
- Calling views directly without client
- Forgetting to create user before login
Recommended
Ready to prove it?
Pass the test and this pattern moves unknown
10 questions ~5 mineasy hard
