Unit Test : 함수 단위(메서드) 단위로 테스트
통합 테스트 : 함수들을 모아서 전체적으로 제대로 구동 되는지 테스트
인수 테스트 : 개발 환경과 운영환경이 다른 경우 개발 환경에서 운영환경으로 이전할 때 수행
블랙 박스 테스트 : 기능 테스트
화이트 박스 테스트 : 구조 테스트
알파 테스트 : 개발자의 장소에서 사용자가 테스트
베타 테스트 : 사용자의 환경에서 사용자가 테스트
구현하려는 기능에 대한 테스트 코드를 작성 - 모양만 생성
테스트 실행 - 실패
테스트를 통과할 수 있는 최소한의 기능을 구현
테스트를 실행시키고 통과시키면 코드를 정리
모든 기능을 구현할 때 까지 이를 반복
Model ➔ Service ➔ Controller ➔ View
from django.test import TestCase
from .models import Book #사실 에러
# Create your tests here.
class ModelTest(TestCase):
# 테스트를 수행하기 전에 호출되는 함수
def setup(self):
self.book_title = 'harry poter'
self.book_author= 'lee'
self.book = Book(
title=self.book_title, author = self.book_author)
# 테스트를 위한 함수
def test_model_can_create_a_bucketlist(self):
old_count = Book.objects.count()
self.book.save()
new_count = Book.objects.count()
self.assertNotEqual(old_count, new_count)
$ python manage.py test
from django.db import models
# Create your models here.
class Todo(models.Model):
title = models.CharField(max_length=100)
description = models.TextField(blank=True)
created = models.DateTimeField(auto_now_add=True)
complete = models.BooleanField(default=False)
important = models.BooleanField(default=False)
# 디버깅을 위해서 사용 - print로 인스턴스를 출력하면 호출되는 메서드
def __str__(self):
return self.title
#### Book 클래스
class Book(models.Model):
title = models.CharField(max_length=128)
author = models.CharField(max_length=128)
$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py test
from rest_framework import serializers
from .models import Todo
class TodoSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Todo
fields = ('id', 'title', 'complete','important')
class TodoCreateSerializer(serializers.ModelSerializer):
class Meta:
model = Todo
fields = ('title', 'description', 'complete','important')
class TodoDetailSerializer(serializers.ModelSerializer):
class Meta:
model = Todo
fields = ('id', 'title', 'description', 'created', 'complete', 'important')
from.models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ('id','title','author')
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Todo
from .serializers import TodoSimpleSerializer, TodoCreateSerializer
class TodosAPIView(APIView):
def get(self, request):
todos = Todo.objects.filter(complete=False)
serializer = TodoSimpleSerializer(todos, many=True)
return Response(serializer.data,status=status.HTTP_200_OK)
def post(self,request):
# 파라미터를 가져와서 serializer를 생성
serializer = TodoCreateSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status.HTTP_201_CREATED)
return Response(serializer.errors, status.HTTP_400_BAD_REQUEST)
from .serializers import TodoDetailSerializer
from rest_framework.generics import get_object_or_404
class TodoAPIView(APIView):
def get(self, request, pk):
# id 가 pk 인 데이터를 조회하고 없으면 404 에러 발생
todo = get_object_or_404(Todo, id=pk)
serializer = TodoDetailSerializer(todo)
return Response(serializer.data,status=status.HTTP_200_OK)
def put(self, request, pk):
# id가 pk 인 데이터를 조회하고 없으면 404 에러 발생
todo = get_object_or_404(Todo, id=pk)
serializer = TodoCreateSerializer(todo, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)
#
class DoneTodosAPIView(APIView):
def get(self, request):
dones = Todo.objects.filter(complete=True)
serializer = TodoSimpleSerializer(dones,many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
# 완료로 수정하기 위한 처리
class DoneTodoAPIView(APIView):
def get(self, request, pk):
done = get_object_or_404(Todo, id=pk)
done.complete = True
done.save()
serializer = TodoDetailSerializer(done)
return Response(serializer.data, status=status.HTTP_200_OK)
from .serializers import BookSerializer
from .models import Book
from rest_framework import generics
class CreateView(generics.CreateView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def perform_create(self,serializer):
serializer.save()
"""
from django.contrib import admin
from django.urls import path
from django.contrib import admin
from django.urls import path
from mytodoapp.views import TodosAPIView, TodoAPIView, DoneTodosAPIView, DoneTodoAPIView
from mytodoapp.views import CreateView
urlpatterns = [
path('admin/', admin.site.urls),
path('todo', TodosAPIView.as_view()),
path('todo/<int:pk>',TodoAPIView.as_view()),
path('done', DoneTodosAPIView.as_view()),
path('done/<int:pk>',DoneTodoAPIView.as_view()),
path('api/books/',CreateView.as_view())
]