[TIL] Unit test

Yerin·2020년 1월 6일
0

Unit test

테스트는 곧 검증작업. 작성한 코드가 잘 작동이 되는지 반드시 확인해야한다.

End to End Testing / UI testing

-처음부터 끝까지 모든 연결이 된 상태에서 테스트
-사람이 직접 입력해보고 버튼 클릭해보는 것.
-다 완성이 되어야 하고 준 배포식으로 띄워야됨. 사람이 직접 해야되는거고 시간이 젤 오래걸림. 그래서 실수도 많을 수 있음. 하지만 젤 직관적이고 하기 쉬움.

Integration testing

-해당 서버만 띄워서 http요청보내서 제대로 리턴되는지 확인하는것. (프론트/백 따로)
-어느 정도 공수가 든다. 왜냐면 일단 서버 띄워야되고 사람이 직접해야되는 것이라서.

Unit testing

-나의 코드 중 테스트할 수 있는 가장 작은 단위. 즉 함수를 테스트.
-내 코드를 테스트할 수 있는 코드를 짜서 확인.
-코드를 실행하는거라 빨리 검증할 수 있고 반복적으로 계속 돌릴 수 있다.
-기존 기능에 새로 추가되면 사람이 다 검증하기가 어렵지만 유닛테스트는 자동적으로 검증가능.
-역추적.. 프론트에서 잘못된건지 백에서 잘못된건지 알아보고 다시 테스트하고 ..
너무 과정이 길어짐.

-아무리 간단한거라 해도 사람이기 때문에 간과할 수 있고, 코드는 계속 변하기 때문에 (내가 짠 코드에 남이 수정할수도있는 것) 그래서 작은것도 테스트. 기존에 있었던 코드를 수정하고 예전에 됏는데 지금은 안되는 이슈를 migration 이슈하라고 한다.

-각 테스트 유닛은 반드시 독립적이어야한다. stateless, request, response. 유닛테스트는 stateless이어야한다. 왜냐면, 독립적이지 않으면 테스트가 실행되는 순서에 따라 통과될 수도 있고 못할수도있다. 호출되는 순서와 무관하게 잘 독장되어야 한다. 새로운 데이터셋으로 각각의 테스트를 로딩하고 그 실행결과는 꼭 삭제해야 한다. setUp()과 tearDown()메소드로 이런 작업을 한다.

(tests.py 예시코드)

import json
from datetime import datetime
from .models import Users
from django.test import TestCase
from django.test import Client
from unittest.mock import patch, MagicMock
class UserGoogle(TestCase):
   def setUp(self):
       Users.objects.create(
           id           = '1',
           name         = '아이유',
           password     = '',
           email        = 'iu@iu.com',
           picture      = 'https://www.google.com/url?sa=i&source=images&cd=&ved=2ahUKEwiirIu-75PkAhUTzIsBHWTfCG8QjRx6BAgBEAQ&    url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FIU_(singer)&psig=AOvVaw2dRN23ywDLuKXrbwdRVrk6&ust=1566473717808080',
           phone_number = '01012341234',
           social_id    = '123456'
       )
   def teardown(self):
       Users.objects.get(name='아이유').delete()
   @patch("account.views.requests")
   def test_user_google_signup(self, mocked_requests):
       c = Client()
       class MockedResponse:
           def json(self):
               return {
                   "sub"     : "12345",
                   "name"    : "제니",
                   "email"   : "jenny@jenny.com",
                   "picture" : "https://www.google.com/url?sa=i&source=images&cd=&ved=2ahUKEwiksaD0lZbkAhUIE6YKHcmRBHAQjRx6BAgBEAQ&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DytuIIuX3Ryc&psig=AOvVaw3RleGxw1qI3kWLS8fZJ2Tp&ust=1566552751444591"
               }
       mocked_requests.get = MagicMock(return_value = MockedResponse())
       response = c.get("/account/social", **{"HTTP_AUTHORIZATION":"1234","content_type" : "application/json"})
       self.assertEqual(response.status_code, 200)
       self.assertEqual(
           response.json(),
               {
                   "message" : "SUCCESS_SIGNUP"
               }
       )

-test coverage가 90프로 이상 되도록 해야한다.
CI/CD 계속해서 deploy하는것. 깃에 푸쉬를 하면 깃허브가 푸쉬되자마자 빌드서버에 notification을 줘서 자동으로 유닛테스트를 해서 자동으로 배포.

-CI: continue integration (빌드 및 테스트 자동화)
-CD: continue deployment (배포 자동화)

ref:https://itholic.github.io/qa-cicd/

profile
졸꾸 !!!

0개의 댓글