Unit Test을 알아보자 ! 🤔

0

DJANGO

목록 보기
7/9
post-thumbnail

출처:

유닛 테스트란?🤔

독립적인 콤포넌트의 (성능이 아닌) 기능적인 동작을 검증한다. 흔히 class나 function 레벨로 수행한다

DJANGO는 파이썬 표준 라이브러리 UnitTest로 만들어진 작은 클라스 계층의 테스트 툴을 제공합니다. 그래서 내가 작성한 로직을 테스트하는 유닛테스트 코드를 짜서 테스트하게 됩니다. 해당 유닛테스트를 사용하는 이유는 API를 테스트하는데 앤드포인트가 10개라면 테스트할 때 Httpie나 Postman을 사용하면 수분이 걸릴 것을 유닛테스트를 진행하게 되면 수초안에 해결할 수 있기 때문에 사용하죠! 거기다가 추가적으로 사람이 테스트를 하게 될 경우, 부정확성과 비용에 대한 부분도 생각해야 되기 때문에 여러면에서 Unittest을 사용하는 것이 효율적이겠죠?

테스트의 규칙⚙️

Unit Test를 구현할 때 지켜야 하는 일반적인 원칙들입니다. (해당 자료는 다양한 블로그를 참조해서 작성했습니다.)

  • 테스트 유닛은 각 기능의 가장 작은 단위에 집중하여, 해당 기능이 정확히 동작하는지를 증명해야 합니다.
  • 각 테스트 유닛은 반드시 독립적이어야 합니다. 각 테스트는 혼자서도 실행 가능해야하고, 테스트 슈트로도 실행 가능해야 합니다. 이 때, 호출되는 순서와 무관하게 잘 동작해야 합니다. 이 규칙이 뜻하는 바, 새로운 데이터셋으로 각각의 테스트를 로딩해야 하고, 그 실행 결과는 꼭 삭제해야합니다. 보통 setUp() 과 tearDown() 메소드로 이런 작업을 합니다.
  • 테스트가 빠르게 돌 수 있도록 만들기 위해 노력해야 합니다. 테스트 하나가 실행하는데 몇 밀리세컨드 이상의 시간이 걸린다면, 개발 속도가 느려지거나 테스트가 충분히 자주 수행되지 못할 것입니다. 테스트에 필요한 데이터 구조가 너무 복잡하고, 테스트를 하려면 매번 이 복잡한 데이터를 불러와야 해서 테스트를 빠르게 만들 수 없는 경우도 있습니다. 이럴 때는 무거운 테스트는 따로 분리하여 별도의 테스트 슈트를 만들어 두고 스케쥴 작업을 걸어두면 됩니다. 그리고 그 외의 다른 모든 테스트는 필요한 만큼 자주 수행하면 됩니다.
  • 지금 사용하고 있는 툴이 개별 테스트나 테스트 케이스를 어떻게 수행하는지 배우셔야 합니다. 모듈 안에 들어있는 함수를 개발하고 있다면, 그 함수의 테스트를 자주, 가능하다면 코드를 저장할 때마다 자동으로 돌려야 합니다.
  • 그날의 코딩을 시작하기 전에 항상 풀 테스트 슈트를 돌려야 합니다. 끝난 후에도 마찬가지입니다. 이 작업은 당신이 다른 코드를 망가뜨리지 않았다는 더 큰 자신감을 심어줄 것입니다.
  • 모두가 공유하는 저장소에다가 코드를 집어넣기 전에 자동으로 모든 테스트를 수행하도록 하는 훅을 구현하는 하는 것이 좋습니다.
  • 지금 한창 개발 중인데 그만두고 잠시 다른 일을 해야한다면, 다음에 개발할 부분에다가 일부러 고장난 유닛 테스트를 작성하는 것도 좋은 생각입니다.
  • 코드를 디버깅할 때 가장 먼저 시작할 일은 버그를 찝어내는 새로운 테스트를 작성하는 것입니다. 이런 일이 언제나 가능한 것은 아니지만, 이런 버그 잡이 테스트들이야말로 당신의 프로젝트에서 가장 가치있는 코드 조각이 될 것입니다.
  • 테스트 함수에는 길고 서술적인 이름을 사용하셔야 합니다. 테스트에서의 스타일 안내서는 짧은 이름을 보다 선호하는 다른 일반적인 코드와는 조금 다릅니다. 테스트 함수는 절대 직접 호출되지 않기 때문입니다. 실제로 돌아가는 코드에서는 square() 라든가 심지어 sqr() 조차도 괜찮습니다. 하지만 테스트 코드에서는 test_square_of_number_2(), test_square_negative_number() 같은 이름을 붙여야 합니다. 이런 함수명들은 테스트가 실패할 때나 보입니다. 그러니 반드시 가능한 한 서술적인 이름을 붙여야 합니다.
  • 무언가 잘못되었거나 뜯어고쳐야만 할 경우, 괜찮은 코드에 테스트 셋이 있다면 당신이나 다른 유지보수 담당자들은 오류를 수정하거나 프로그램의 동작을 수정할 때 필시 그 테스트 슈트에 전적으로 의지할 것입니다.
  • 테스트 코드의 또다른 사용 방법은 새로운 개발자들을 위한 안내서로 쓰는 방법입니다. 이미 만들어져 있는 코드에서 작업해야할 경우, 관련 테스트 코드를 돌려보고 읽어보는 것이야말로 가장 좋은 시작점일 경우가 많습니다. 이렇게 테스트 코드를 돌려보면 어느 지점이 문제인지, 수정하기 어려운 곳은 어디일지, 막다른 골목은 어디일지를 발견하게 됩니다. 몇 가지 기능을 추가해야 한다면 가장 먼저 해야할 일은, 그 새로운 기능이 아직 돌아가지 않음을 확인할 수 있는 테스트를 붙여넣는 것입니다.

실제 적용 !!! 😎

import json

from homes.models import Home, HomeType, BuildingType,Region,PriceCategory,HomePrice
from django.test import TestCase, Client

class HomeListTest(TestCase):
    def setUp(self):
        building_type = BuildingType.objects.create(
            name = '집 전체'
        )
        
        home_type = HomeType.objects.create(
            name = '다인실'
        )
    
        region = Region.objects.create(
            id   = 1,
            name = "강남구",
            latitude = "37.492465",
            longitude = "127.068818",
            zoom_level = 13,
            around_radius_m = 8000
        )

        region2 = Region.objects.create(
            id = 2,
            name = "구로구",
            latitude = "37.392465",
            longitude = "127.168818",
            zoom_level = 13,
            around_radius_m = 8000
        )

        price = PriceCategory.objects.create(
            name = "1박비용"
        )

        home1 = Home.objects.create(
            name             = "승재's 오피스텔 #2 구일점",
            address          = "구로구, 서울, 대한민국",
            description      = "Welcome to my home. 저희 집에 오신것을 환영합니다.",
            capacity_guest   = 4,
            latitude         = 37.501670,
            longitude        = 127.035530,
            home_type        = home_type,
            building_type    = building_type,
            region           = region2
        )
        
        home2 = Home.objects.create(
            name             = "승재's 오피스텔 #2 강남점",
            address          = "강남구, 서울, 대한민국",
            description      = "Welcome to my home. 저희 집에 오신것을 환영합니다.",
            capacity_guest   = 4,
            latitude         = 37.301670,
            longitude        = 127.135530,
            home_type        = home_type,
            building_type    = building_type,
            region           = region
        )

        HomePrice.objects.create(home=home1,price_category=price,cost=10000)
        HomePrice.objects.create(home=home2,price_category=price,cost=100000)

    def tearDown(self):
        Home.objects.all().delete()
        HomeType.objects.all().delete()
        BuildingType.objects.all().delete()
        Region.objects.all().delete()

    def test_homelistview_get_success(self):
        client = Client()
        response = client.get('/homes')
        self.assertEqual(response.json()['homes'][0]['home_name'], "승재's 오피스텔 #2 구일점")
        self.assertEqual(response.status_code, 200)

    def test_homelistview_get_filtering_region(self):
        client = Client()
        response = client.get('/homes?region=1')
        self.assertEqual(response.json()['homes'][0]['region']['region_name'], "강남구")
        self.assertEqual(response.status_code, 200)

    def test_homelistview_get_not_found(self):
        client = Client()
        response = client.get('/homes?region=3')
        self.assertEqual(response.status_code, 404)

현재 상황

  • 현재 2차 프로젝트로 숙박업소 데이터가 필요하여 Models에 숙박 (Home)과 해당 숙박의 숙박 유형/건물 유형/ 지역 정보/ 가격정보(HomeType, BuildingType, RegionType, PriceCategory)가 있습니다.

  • 먼저 setUp() 함수로 테스트에 필요한 객체들을 선언!

  • 해당 데이터는 다른 DB 풀에서 생성되기 때문에 실제 DB 데이터와는 상관이 없습니다.

  • 해당 테스트가 끝나고 만들었던 데이터를 삭제하는 tearDown() 메소드 설정 !

  • 그 밑으로는 Client()객체를 만들어서 API 앤드포인트 호출시 조회된 값이 잘 오는지는 로직을 짜면 끝!

  • 결과 화면 ~!

  • 위에 사진처럼 준비한 테스트를 python test 테스트할 APP명명령어로 시작하면 테스트에 통과했는지 안 했는지를 알 수 있습니다 !

끝 🌈

profile
# 개발 # 컴퓨터공학

0개의 댓글