๊ฐ๋ฐ ๊ณต๋ถ๋ฅผ ํ๋ ์ฌ๋๋ค์ด๋ผ๋ฉด ํ ์คํธ ์ฝ๋์ ์ค์์ฑ์ ๋ค๋ค ์๊ณ ์์ ๊ฒ์ด๋ค. ํ์ง๋ง ์ค์ํ ๊ฒ์ด๋ ์ง๋ ๊ฒ์ ๋ค๋ฅด์ง... ๋๋ ์ง๊ธ๊น์ง ํ ์คํธ ์ฝ๋๋ฅผ ์ง์ง ์์๊ณ , ์ค์์ฑ ๋ํ ๊ทธ๋ ๊ฒ ๋๋ผ์ง ๋ชปํ๋ค. ํ์ง๋ง ์ญ์ ์ค์ํ๋ค ํ๋ ๊ฒ์ ์ค์ํ ์ด์ ๊ฐ ์์๋ค... ์ด๋ฒ์ ํ๋ก์ ํธ ํ๋๋ฅผ ์งํํ๋ฉฐ ํ ์คํธ ์ฝ๋์ ์ค์์ฑ์ ๋๋ผ๊ฒ ๋์๋ค. ์งง๊ฒ ์์ฝํ์๋ฉด
์, ์์ฃผ ๋ฉ์ง ๊ฒฝํ์ด์๋ค... ํ์ง๋ง ์ฌ๊ธฐ์ ์ค์ํ๊ฑด
์, ์ด์ ์ค์์ฑ์ด ์์ํ ๋๊ปด์ง๊ธฐ ์์ํ ๊ฒ์ด๋ค. ํ ๊ฐ์ง ์ํฉ์ ๊ฐ์ ํด๋ณด์. ๋น์ ์ ํฌํจํ 5๋ช ์ด์ ์๋ฒ๋ฅผ ๊ฐ๋ฐํ๋ค. ์ธ์์, ๊ฐ์๊ธฐ 500์ด ๋ฌ๋ค! ์ด์ ๋น์ ์ ๋๋จธ์ง 4๋ช ์ ๋ถ๋ฌ ๋ชจ์ ์น๊ธฐ์ข ๊ธฐ ๋ชจ์ฌ postman ์ผ๋ก ๋ชจ๋ api ๋ฅผ ํ ์คํธ ํ๊ธฐ ์์ํ ๊ฒ์ด๋ค...
๋ฉฐ์น ํ, ๋น์ ์ ํ์ ๋๋์ด ๋ชจ๋ ์ค๋ฅ๋ฅผ ๊ณ ์ณค๋ค! ๋๊ทผ๋๊ทผ, ๋ฐฐํฌ๋ฅผ ํ๊ณ ์ค์ ๋ก ์๋น์ค๋ฅผ ํ ๊ฒ์ด๋ค. ์ฌ์ฉ์๋ค์ด ๋น์ ์ ์๋น์ค๋ฅผ ์ด์ฉํ ๊ฒ์ด๊ณ ... ์ด๋ฐ! 500์ด ๋ด๋ค! ๋์ฒด ์ด์ ๊ฐ ๋ฌด์์ผ๊น? ์ด์ ๋น์ ์ ๋๋จธ์ง 4๋ช ์ ๋ถ๋ฌ ๋ชจ์ ์น๊ธฐ์ข ๊ธฐ...(์๋ต)
์ด์ ๋๋ฉด ํ ์คํธ๋ฅผ ํด์ผ ํ๋ ์ด์ ๋ ์ถฉ๋ถํ ์ค๋ช ํ๋ค๊ณ ์๊ฐํ๋ค. ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ด๋ ต๊ณ ๊ท์ฐฎ๋ค. ์๊ฐ๋ ๋ง์ด ๋ ๋ค. ํ์ง๋ง ๋์ค์ ์๊ธธ ๋ฒ๊ทธ๋ฅผ ์ฐพ๋ ๊ฒ๋ณด๋ค๋ ํจ์ฌ ์๊ฐ์ด ๋ ๋ค ๊ฒ์ด๋ค...
์ฌ์ค ๋๋ ํ ์คํธ ์ฝ๋๋ฅผ ๋ง์ด ์ง๋ณด์ง ์์๋ค. ์๋ ๊ทธ๋ฅ ์ด๋ณด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ด ์ง์๋ณด๋ค๋ django ๊ณต์ ์ฌ์ดํธ์ WikiDocs ์ ์๋ django ์์ต, ๊ทธ๋ฆฌ๊ณ MDN ์ ์๋ Django ํํ ๋ฆฌ์ผ ํํธ๋ฅผ ์ฐธ๊ณ ํ ๊ฒ์ ๋ฏธ๋ฆฌ ๋ฐํ๋ค.
test์ ์ข ๋ฅ๋ ๋ฌด์ํ ๋ง๋ค. ์ด ์ค, ๊ฐ์ฅ ์ค์ํ ๊ฒ์ 3๊ฐ์ง ๋ฝ์๋ฉด
Unit tests (์ ๋ ํ ์คํธ)
๋ ๋ฆฝ์ ์ธ ์ฝคํฌ๋ํธ์ (์ฑ๋ฅ์ด ์๋) ๊ธฐ๋ฅ์ ์ธ ๋์์ ๊ฒ์ฆํ๋ค. ํํ class๋ function ๋ ๋ฒจ๋ก ์ํํ๋ค.
Regression tests ( ๋ฒ๊ทธ์์ ํ์ธ ํ ์คํธ )
๊ธฐ์กด์ ๋ณด๊ณ ๋ ๋ฒ๊ทธ๋ค์ด ์ฌ๋ฐํ๋์ง ํ ์คํธํ๋ค. ๊ฐ ํ ์คํธ๋, ๋จผ์ ์ด์ ์ ๋ฐ์ํ๋ ๋ฒ๊ทธ๊ฐ ์์ ๋์๋์ง ์ฒดํฌํ ์ดํ์, ๋ฒ๊ทธ ์์ ์ผ๋ก ์ธํด ์๋กญ๊ฒ ๋ฐ์๋๋ ๋ฒ๊ทธ๊ฐ ์๋์ง ํ์ธ์ฐจ ์ฌ์ํํ๊ฒ ๋๋ค.
Integration tests ( ํตํฉ ํ ์คํธ )
์ ๋ ํ ์คํธ๋ฅผ ์๋ฃํ ๊ฐ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ์ฝคํฌ๋ํธ๋ค์ด ํจ๊ป ๊ฒฐํฉ๋์ด ์ํํ๋ ๋์์ ๊ฒ์ฆํ๋ค. ํตํฉ ํ ์คํธ๋ ์ฝคํฌ๋ํธ๊ฐ์ ์๊ตฌ๋๋ ์ํธ์์ฉ์ ๊ฒ์ฌํ๋ฉฐ, ๊ฐ ์ฝคํฌ๋ํธ์ ๋ด๋ถ์ ์ธ ๋์๊น์ง ๊ฒ์ฆํ ํ์๋ ์๋ค. ์ด ํ ์คํธ๋ ๋จ์ง ์ ์ฒด ์น์ฌ์ดํธ์ ๊ฑธ์ณ ๊ฐ ์ฝคํฌ๋ํธ๊ฐ ๊ฒฐํฉํ์ฌ ์ํํ๋ ๋์์ ๋์์ผ๋ก ํ๋ค.
์ด ์ธ ๊ฐ์ง๊ฐ ์๋ค. ๋ด๊ฐ ์ง๊ธ ๋ฐฐ์ฐ๊ณ ์๋ ๊ฒ์ ๊ฐ์ฅ ์์ ์๋ ์ ๋ ํ ์คํธ์ด๋ค. ๊ฐ๋จํ๊ฒ ๋งํ๋ฉด ๋ด๊ฐ ๋ง๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ํ ์คํธํ๋ ๊ฒ์ด๋ค.
๋๋ ์ด ๋ถ๋ถ์ด ํท๊ฐ๋ ธ๋ค. ๋ชจ๋ ๊ธฐ๋ฅ์ ํ ์คํธํ๋ค๊ณ ํ์ง๋ง, django์๋ ๋ด๊ฐ ์ง๋ ๊ฒ์ด ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ๊ธฐ๋ฅ๋ค์ด ๋ง๋ค. ๊ณผ์ฐ ์ด๋๊น์ง ๋ด๊ฐ ํ ์คํธ ํด์ผ ํ๋ ๊ฒ์ผ๊น? ๊ฐ๋จํ๋ค.
๋ด๊ฐ ๋์์ธ ํ ๋ชจ๋ ๊ฒ์ ํ ์คํธ ํ๋ฉด ๋๋ค.
์ดํด๊ฐ ์ ๋์ง ์์ ๊ฒ์ด๋ค. ์์๋ฅผ ๋ค์ด๋ณด์๋ฉด
models.py
class Post(models.Model):
title = models.CharField(max_length=45)
content = models.CharField(max_length=300)
like = models.IntegerField
def __str__(self):
return self.title
์์ฃผ ๊ฐ๋จํ model ์ด ํ๋ ์๋ค. ์ฌ๊ธฐ์ ํ ์คํธ ํด์ผ ํ ๋ถ๋ถ์ ๋ฌด์์ผ๊น?
__str__()
์ ํธ์ถํ์ ๋ title์ด ๋ฐํ๋๋ค. ๋ฐ๋ก ์ด ์ธ๊ฐ์ง์ด๋ค. title ๊ณผ content ๊ฐ CharField ์ธ ๊ฒ๊ณผ like ๊ฐ IntegerField ์ธ ๊ฒ์ ํ
์คํธํ ํ์๊ฐ ์๋ค. ์ด ๊ธฐ๋ฅ๋ค์ django ์ ์ํด ์ ์๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง max_length ์ __str__()
๋ ๋น์ ์ด ๋์์ธํ ๋ถ๋ถ์ด๊ณ , ์ถํ์ ๋ณ๊ฒฝ๋ ์ ์๊ธฐ ๋๋ฌธ์ test ํด์ผํ๋ค.
django ์์ test ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค. ์ง๋ ๊ฒ์ ์ด๋ ต์ง๋ง
django ์์ app ์ ๋ง๋ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก tests.py ๋ผ๋ ํ์ผ์ด ์๊ธด๋ค. ์ด๊ณณ์ ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํ ๋ค python manage.py test
๋ฅผ ํ๋ฉด ํ
์คํธ๊ฐ ์์๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ์๋ง์ ๊ธฐ๋ฅ์ ํ
์คํธํด์ผ ํ๊ณ , ํ
์คํธ ์ฝ๋๋ฅผ ์์ฃผ์์ฃผ ๊ธธ์ด์ง ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ test ํ์ผ์ ๋ถํ ํ๋ ๊ฒ์ ์ถ์ฒํ๋ค.
python manage.py test
๋ก ์คํ์ํค๋ ํ
์คํธ ์ฝ๋์ ์กฐ๊ฑด์ ๊ฐ๋จํ๋ค.
์ฆ, ์ฐ๋ฆฌ๋ tests.py ํ์ผ์ ์ด๋ ๊ฒ ๋ถํ ํ ์ ์๋ค.
(์กฐ๊ธ ์๋ก๋ฌ๋กํ์ง๋ง ๋์ด๊ฐ๋ฉด ๋๋ค.)
์กฐ๊ธ ๋ ๊น๋ํ๊ฒ ์ ๋ฆฌํด๋ณด์.
์์ฃผ ๊น๋ํด์ก๋ค.
์, ์ด์ ์ ๋ง ์ฝ๋๋ฅผ ์ง๋ณด์.
models.py
from django.db import models
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _
class UserManager(BaseUserManager):
use_in_migrations = True
def _create_user(self, username, password, **extra_fields):
user = self.model(username=username, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(
max_length=45,
unique=True,
)
nickname = models.CharField(
max_length=45
)
objects = UserManager()
USERNAME_FIELD = 'username'
class Meta:
verbose_name = _('user')
verbose_name_plural = _('users')
def __str__(self):
return self.username
def get_short_name(self):
return self.username
์์ ๊ฐ์ user model์ด ์์ ๋ ์ฐ๋ฆฌ๊ฐ ํ ์คํธ ํด์ผ ํ ๊ฒ์ ๋๋ต ์๋์ ๊ฐ๋ค.
__str__()
, get_short_name
์ return ๊ฐtests/test_models.py
from django.test import TestCase
from user_system.models import User
class UserModelTests(TestCase):
@classmethod
def setUpTestData(cls):
User.objects.create_user(username="testuser", password="12345", nickname="testnickname")
def test_username_label(self):
user = User.objects.get(id=1)
field_label = user._meta.get_field('username').verbose_name
self.assertEquals(field_label, 'username')
def test_username_max_length(self):
user = User.objects.get(id=1)
max_length = user._meta.get_field('username').max_length
self.assertEquals(max_length, 45)
def test_nickname_label(self):
user = User.objects.get(id=1)
field_label = user._meta.get_field('nickname').verbose_name
self.assertEquals(field_label, 'nickname')
def test_nickname_max_length(self):
user = User.objects.get(id=1)
max_length = user._meta.get_field('nickname').max_length
self.assertEquals(max_length, 45)
def test_object_name_is_username(self):
user = User.objects.get(id=1)
expected_object_name = user.username
self.assertEquals(expected_object_name, str(user))
์ด๋ ๊ฒ ๋ ๊ฒ์ด๋ค. ์์ํ ์ฝ๋๋ค์ด ๋ง์ ๊ฒ์ด๋ค ๊ฐ๋จํ ์ค๋ช ์ ํ์๋ฉด
1.def setUpTestData()
ํด๋์ค ์ ์ฒด์์ ์ฌ์ฉ๋๋ ์ค์ ์ ์ํด์ ํ ์คํธ ์์ ๋ ๋ฑ ํ ๋ฒ๋ง ์คํ๋จ. ํ ์คํธ ๋ฉ์๋๊ฐ ์คํ๋๋ฉด์ ์์ ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋์ง ์์ ๊ฐ์ฒด๋ค์ ์ด๊ณณ์์ ์์ฑํ ์ ์๋ค. = ๊ฐ์ฒด ์์ฑ
setUpTestData๋ ํ ์คํธ๋ฅผ ์คํํ๋ฉฐ ๋ณ๊ฒฝํ์ง ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์ด์ฉํ๋ค. ๋ง์ฝ ๋ณ๊ฒฝ์ด ํ์ํ๋ค๋ฉด? setUp()์ ์ฌ์ฉํ๋ฉด ๋๋ค.
-> setUp์ ๊ฐ๊ฐ์ ํ ์คํธ ๋ฉ์๋๊ฐ ์คํ๋ ๋๋ง๋ค ์คํ๋จ. setUpTestData๋ ํด๋์ค ์ ์ฒด์์ ์ฌ์ฉ๋๋ ์ค์ ์ ์ํด์ ํ ์คํธ ์์ ๋ ๋ฑ ํ ๋ฒ๋ง ์คํ๋จ.
2. field_label = user._meta.get_field('username').verbose_name
Get the metadata for the required field and use it to query the required field data // ํ๋ ๊ฐ ํ์ธํ๊ธฐ
์ฌ๊ธฐ์ verbose_name์ด๋ ์ฌ๋์ด ์ฝ๊ธฐ ์ข์ ํ๋ ์ด๋ฆ์ ๋งํ๋ค. verbose name์ ์ง์ ์ค์ ํ์ง ์๋ ํ ํ๋๋ช ์ ์๋ฌธ์๋ก ์ค์ ๋๋ค.
์ฌ๊ธฐ์ ํน์ดํ ์ ์ user.username.verbose_name ์ผ๋ก verbose name์ ์ป๋ ๊ฒ์ด ์๋ _meta ๋ฅผ ์ด์ฉํ ๊ฒ์ด๋ค. user.username ์ ์ฐ๋ฆฌ๊ฐ ์ ๊ทผํ ์ ์๋ ๊ฐ์ฒด๊ฐ ์๋ ๋ฌธ์์ด์ด๊ธฐ ๋๋ฌธ์ด๋ค.
3. assertEquals(field_label, 'username')
field_label ๊ฐ์ด username ์ธ์ง ๋น๊ตํ๋ ๊ฒ์ด๋ค. ๋จ, assertTrue()์ ๋ฌ๋ฆฌ ๊ทธ๋ฅ True, False ๊ฐ๋ง ์๋ ค์ฃผ๋ ๊ฒ์ด ์๋๋ผ ์ค๋ฅ๊ฐ ๋๋ฉด ๊ฐ๊น์ง ์๋ ค์ค๋ค๋ ์ฐจ์ด๊ฐ ์๋ค.