Django - Unittest

KDG·2020년 7월 11일
0

Unittest

  • 내가 작성한 코드의 가장 작은단위인 함수나 메소드를 테스트하는 것
  • 코드를 테스트하는 테스트코드를 짜서 테스트를 진행
  • 버그가 발생했을 때 대부분 유닛테스트가 누락된 경우가 많고, 유닛테스트를 잘 짜놓으면 중단기적으로 유지보수가 쉽다.
  • 버그를 fix한 이후에 유닛테스트를 작성해놔야 반복적으로 그러한 버그가 발생하는 것을 방지할 수 있다.

Unittest의 필요성

  • 우리가 개발한 것이 잘 작동하는지 확인
  • 모듈들이 결합해서 동작상 버그가 없는 것을 확인하기 위해

django unittest

  • 앱을 생성 후 tests.py 파일에
    from django.test import TestCase, Client import하기

  • def setUp(self):
    _test로 시작하는 테스트를 시작하기 전에 setup(db 설정)을 해주는 함수
    client 초기화, 테스트에 필요한 데이터베이스를 설정

  • def tearDown(self):
    테스트가 끝나고 수행되는 함수
    테스트하기위해 setup했던 데이터베이스를 정리해주는 작업을 수행

  • def test_
    실제로 테스트가 이루어지는 함수
    테스트를 성공, 실패, 각종 에러 여러부분으로 나누어서 views.py에서 짠 로직과 비교해 잘 작동되는지 테스트한다.

  • 터미널에서 python manage.py test (app이름)으로 테스트파일 실행

예시

class PinDetailTest(TestCase):

    def setUp(self):
        SocialPlatform.objects.create(
            id = 1,
            name = 'Pinterest'
        )
        Gender.objects.create(
            id = 1,
            name = '남성'
        )
        Region.objects.create(
            id = 1,
            name = '대한민국'
        )
        Language.objects.create(
            id = 1,
            language = '한국어'
        )
        Account.objects.create(
            id = 1,
            name = 'kim',
            gender = Gender.objects.get(id=1),
            region = Region.objects.get(id=1),
            language = Language.objects.get(id=1),
            social_platform = SocialPlatform.objects.get(id=1),
            follower_number = 12
        )
        Board.objects.create(
            id = 1,
            name = 'board1',
            account = Account.objects.get(id=1)
        )
        Pin.objects.create(
            id = 1,
            internal_account = Account.objects.get(id=1),
            external_account = Account.objects.get(id=1),
            image_url = 'https://i.pinimg.com/44/48/a7/11118e7efc90286a8dff112211dea9750.jpg',
            title = 'hello',
            detail = 'hi',
            link = 'https://twitter.com/',
        )
        BoardPin.objects.create(
            id = 1,
            board = Board.objects.get(id=1),
            pin = Pin.objects.get(id=1)
        )
    
    def tearDown(self):
        Account.objects.all().delete()
        Board.objects.all().delete()
        Pin.objects.all().delete()
        Gender.objects.all().delete()
        Region.objects.all().delete()
        Language.objects.all().delete()
        BoardPin.objects.all().delete()

    def test_pindetail_get_success(self):
        client = Client()
        response = client.get('/boardpin/pin?pin_id=1', content_type = 'application/json')
        self.assertEqual(response.json(),{
            'pin' : [{
                'internalAccount' : 'kim',
                'externalAccount' : 'kim',
                'imgUrl' : 'https://i.pinimg.com/44/48/a7/11118e7efc90286a8dff112211dea9750.jpg',
                'title' : 'hello',
                'detail' : 'hi',
                'link' : 'https://twitter.com/',
                'boardName' : 'board1',
                'followNumber' : 12
            }]
        }
        )
        self.assertEqual(response.status_code, 200)

    def test_pindetail_get_not_found(self):
        client = Client()
        response = client.get('/boardpin/pin?pin_id=200', content_type = 'application/json')
        self.assertEqual(response.json(),{'message' : 'NO_PIN'})
        self.assertEqual(response.status_code, 400)

    def test_pindetail_get_keyerror(self):
        client = Client()
        response = client.get('/boardpin/pi', content_type = 'application/json')
        self.assertEqual(response.status_code, 404)

0개의 댓글