[Django]심화학습 5주차 TestCode

손성수·2023년 4월 26일
0

테스트 터미널 명령어

python manage.py test

drf 테스트 공식문서

로그인 인증 관련 테스트 코드 자료 -GIT HUB

테스트 코드는 순서가 보장되지 않음
setup을 통해 우선순위 지정 가능

로그인 인증 test code



classmethod

from datetime import date


class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    @classmethod
    def fromBirthYear(cls,name,birthYear):
        return cls(name,date.today().year-birthYear)

    def display(self):
        print(self.name,str(self.age))


# person = Person('son',29)
# person.display()

person = Person.fromBirthYear('son',1995)
person.display()

classmoethod를 통해 생성자 호출도 동시에 가능



staticmethod

class Person:

	...
    
    @staticmethod
    def isAdult(age):
        return age>18

클래스 외부, 함수로 작성한것과 동일한 기능을하는 메소드 생성
사용하는 이유는 클래스 내부에서만 사용할 기능이며, 코드의 가독성을 위해 사용한다.



classmethod를 이용한 기본값 설정

class ArticleCreateTest(APITestCase):
    @classmethod
    def setUpTestData(cls):
        cls.user_data = {'email':'test@naver.com','password':'123'}
        cls.article_data = {'title':'제목','content':'내용'}
        cls.user = User.objects.create_user('test@naver.com','123')

    def setUp(self):
        self.access_token = self.client.post(reverse('token_obtain_pair'), self.user_data).data['access']
  • 테스트 케이스가 너무나 많아지게되면 일일이 더미네이터를 적용하기 불편하고 시간이 오래걸리기에
    classmethod를 이용한다.


게시글 작성 및 조건 불총족 테스트 코드

class ArticleCreateTest(APITestCase):
    @classmethod
    def setUpTestData(cls):
        cls.user_data = {'email':'test@naver.com','password':'123'}
        cls.article_data = {'title':'제목','content':'내용'}
        cls.user = User.objects.create_user('test@naver.com','123')

    def setUp(self):
        self.access_token = self.client.post(reverse('token_obtain_pair'), self.user_data).data['access']

    # 로그인 하지 않았을때 글 작성을 할 수 없는지 테스트
    def test_fail_if_not_logged_in(self):
        url = reverse('article_view')
        response = self.client.post(url,self.article_data)
        self.assertEqual(response.status_code,401)

    # 게시글 작성 테스트
    def test_create_articles(self):
        response = self.client.post(
            path=reverse('article_view'),
            data=self.article_data,
            HTTP_AUTHORIZATION = f"Bearer {self.access_token}"
        )
        self.assertEqual(response.status_code,201)
	
    # 게시글 작성 조건을 충족하지 못할 경우
    def test_fail_if_not_create_articles(self):
        response = self.client.post(
            path=reverse('article_view'),
            # data=self.article_data,
            HTTP_AUTHORIZATION=f"Bearer {self.access_token}"
        )
        self.assertEqual(response.status_code,400)

게시글 작성 테스트 이미지파일 추가

import

from django.test.client import MULTIPART_CONTENT, encode_multipart,BOUNDARY
from PIL import Image
import tempfile

임시파일 생성 함수

def get_temporary_image(temp_file):
    size = (200,200)
    color = (255,0,0,0)
    image = Image.new("RGBA",size,color)
    image.save(temp_file,'png')
    return temp_file

메소드 추가

class ArticleCreateTest(APITestCase):

	....생략
    
    
    def test_create_article_with_image(self):
        # 임시 이미지 파일 생성
        temp_file = tempfile.NamedTemporaryFile()
        temp_file.name = "image.png"
        image_file = get_temporary_image(temp_file)
        image_file.seek(0)

        # article_data dict update
        self.article_data['image'] = image_file

        # 전송
        response = self.client.post(
            path=reverse('article_view'),
            data=encode_multipart(data = self.article_data, boundary=BOUNDARY),
            content_type=MULTIPART_CONTENT,
            HTTP_AUTHORIZATION=f"Bearer {self.access_token}"
        )
        self.assertEqual(response.status_code, 201)

더미네이터를 위한 Faker 추가

pip install Faker
from faker import Faker
fake = Faker("ko_KR")

print(fake.name())
print(fake.first_name())
print(fake.last_name())
print(fake.word())
print(fake.sentence())
print(fake.text())

profile
더 노력하겠습니다

0개의 댓글

관련 채용 정보