Testing
Testing
3 levels
- direct testing (python api)
- DRF testing (direct json)
- server testing (full json api)
Setting Up the Testing Environment
Ensure you have
pytest
andpytest-django
installed. These are popular packages that enhance Django’s built-in testing framework.
pip install pytest pytest-django
Configure pytest:
Create a
pytest.ini
file in the root of your project to configurepytest
:
[pytest]
DJANGO_SETTINGS_MODULE = myproject.settings
python_files = tests.py test_*.py *_tests.py
Or > Add to pyproject.toml
[tool.pytest.ini_options]
DJANGO_SETTINGS_MODULE = "rm.settings"
python_files = ["*test*.py"]
Writing Tests
Model Tests
Model tests ensure that your models behave as expected.
# questionnaire/tests/test_models.py
import pytest
from questionnaire.models import Questionnaire, Question, Choice, Response, Answer
from base.models import Client
@pytest.mark.django_db
def test_create_questionnaire():
= Questionnaire.objects.create(title="Test Questionnaire", description="A test questionnaire.")
questionnaire assert questionnaire.title == "Test Questionnaire"
assert questionnaire.description == "A test questionnaire."
Serializer Tests
# questionnaire/tests/test_serializers.py
import pytest
from questionnaire.serializers import QuestionnaireSerializer
from questionnaire.models import Questionnaire
@pytest.mark.django_db
def test_questionnaire_serializer():
= {"title": "Test Questionnaire", "description": "A test questionnaire."}
data = QuestionnaireSerializer(data=data)
serializer assert serializer.is_valid()
= serializer.save()
questionnaire assert questionnaire.title == "Test Questionnaire"
Testing Views and Endpoints
# questionnaire/tests/test_views.py
import pytest
from django.urls import reverse
from rest_framework import status
from questionnaire.models import Questionnaire
@pytest.mark.django_db
def test_create_questionnaire(api_client):
= reverse('questionnaire-list')
url = {"title": "Test Questionnaire", "description": "A test questionnaire."}
data = api_client.post(url, data, format='json')
response assert response.status_code == status.HTTP_201_CREATED
assert Questionnaire.objects.count() == 1
assert Questionnaire.objects.get().title == "Test Questionnaire"
Testing with Fixtures
# questionnaire/tests/test_views_with_fixtures.py
import pytest
from django.urls import reverse
from rest_framework import status
from base.models import Client
from questionnaire.models import Questionnaire, Question, Response
@pytest.fixture
def client_data():
return {"name": "Test Client", "email": "testclient@example.com", "sex": "M", "dob": "1990-01-01"}
@pytest.fixture
def client(client_data):
return Client.objects.create(**client_data)
@pytest.fixture
def questionnaire():
return Questionnaire.objects.create(title="Test Questionnaire", description="A test questionnaire.")
@pytest.mark.django_db
def test_create_response(api_client, client, questionnaire):
= reverse('response-list')
url = {"questionnaire": questionnaire.id, "client": client.id}
data = api_client.post(url, data, format='json')
response assert response.status_code == status.HTTP_201_CREATED
assert Response.objects.count() == 1
assert Response.objects.get().client == client