취미삼아 배우는 프로그래밍

장고 테스트 코드 작성기 본문

코드 자가리뷰(장고)

장고 테스트 코드 작성기

Nadure 2020. 8. 8. 09:31

nadure.tistory.com/37?category=851426

 

혼자서 만드는 마감정산 시스템(Django)

장고 코딩하다 막혀서 풀어보는 #리뷰 자가 코드 리뷰 (영감을 얻어 가셨으면 합니다.) 1. 모델(전체) from django.db import models from jsonfield import JSONField from django.db.models import F, Sum, Coun..

nadure.tistory.com

 

 

여기에서 만든 모델에

이와 같이 엑셀로 만든 데이터를 넣었어야 했다.

 

근데

판다스 데이터프레임을 여기에 끼워넣어야 한다(..)

이와 같이 생겨먹은 모델에 저 위의 데이터들을 끼워넣자니 여간 시행착오가 생기는게 아니다.

 

 

수 많은 테스트들, 그러니까 테스트 한 번 하고 데이터베이스를 지우고를 계속해서 반복해야한다.

그거도 이 알량한 쉘 창 하나로 계속 써가면서.. 해야한다. o.objects.create() > error....

근데 그마저도 어드민 페이지에서 데이터가 잘 들어갔는지를 확인해줘야한다. 딱봐도 고생각이 보였다.

 

이리저리 방법을 생각해보다가, 테스트코드를 작성하기로 했다.

예전부터 TDD가 좋다느니, TDD로 코드를 짜야한다드니 라는 말은 들었었는데, 이참에 해보기로 했다.

 

근데 Django TestCase에 대해서 문서상 제일 작성이 잘돼있는곳은 여기밖에 없었다.

developer.mozilla.org/ko/docs/Learn/Server-side/Django/Testing

 

Django 튜토리얼 파트 10: Django 웹 어플리케이션 테스트하기

Writing test code is neither fun nor glamorous, and is consequently often left to last (or not at all) when creating a website. It is however an essential part of making sure that your code is safe to release after making changes, and cost-effective to mai

developer.mozilla.org

 

 

난 이전에는 assert가 왜 쓰이는지를 도통 알 수가 없었는데,

테스트 코드를 작성하면서 알게됐다. 이거는 있어야 할 수 밖에 없었다.

assert는 의도한 값이 다르게 들어가면 코드 전체를 멈춰준다. 거의 뭐 테스트 코드 전용이 아닐까 하는 생각이 든다.

 

그렇게 해서 만든 코드

from django.test import TestCase
from django.utils.timezone import timezone
from coat_finishing.models import (DataOneRow, ProductList, 
    DetailedData, TheOneDistrict, BaseData, CoatCompanyModel)

# self.assertTrue(False)

class BulkCreateModelTest(TestCase):
    company = '대림'
    location_name = '망우동'
    district = 'A-1'
    coated_company = '삼동'

    @classmethod
    def setUpTestData(cls):
        def return_product_id(name):
            product, created = ProductList.objects.get_or_create(product=name)
            return product.id

        bulk_list = [
            DataOneRow(
                product_name_id=return_product_id('PANEL'),
                w1_value=999, h_value=9999, B_value_quantity=20
            ),
            DataOneRow(
                product_name_id=return_product_id('BSL'),
                w1_value=888, h_value=888, C_value_quantity=30
            ),
        ]
        bulk_list = bulk_list*1000 # 2,000 datas

        rows = DataOneRow.objects.bulk_create(bulk_list)
        for i in rows:
            i.save()

        detailed = DetailedData(changes_log='신규')
        detailed.save()
        detailed.data_rows.add(*rows)
        detailed.save()

        coat_instance, created = CoatCompanyModel.objects.get_or_create(coated_company=cls.coated_company)
        
        one_district = TheOneDistrict.objects.create(company=cls.company, location_name=cls.location_name,
            district=cls.district, detailData_id=detailed.id)

        BaseData.objects.create(coated_company=coat_instance, one_district_id=one_district.id)

    def test_DetailedData_datacheck(self):
        a = DetailedData.objects.all()[0]
        self.assertTrue(bool(a))
    
    def test_all_data_validation(self):
        base = BaseData.objects.get(id=1)
        self.assertEqual(self.coated_company, base.coated_company.coated_company)
        self.assertEqual(self.company, base.one_district.company)
        self.assertEqual(self.location_name, base.one_district.location_name)
        self.assertEqual(self.district, base.one_district.district)

 

지금 필요했던건, 데이터베이스를 테스트용도로 짜올리는거였지, 값의 확인등과 같은 다른건 별로 중요치 않았다.

def setUpTestData(cls):

부분을 통해서 데이터베이스를 실험삼아 쌓아올릴 수 있다.

그러면 테스트 후 생기는 이런저런 데이터 정리 작업 필요없이, 그냥 계속 코드만 작동되는지를 확인해나갈 수 있는것이다.

 

이걸 통해 느꼈다.

assert는 되게 필요한 놈이었고,

테스트 코드 작성은 결과물이 중요한게 아니라, 과정자체를 수월하게 해주는데 의미가 있다는걸 깨달았다. 그리고 이 테스트 코드들이 나중에 모두 모였을 때, 의도치 않았던 추후에 코드를 작성하며 생길 버그들까지도 자연스레 테스트하게 된다는걸 깨달았다.

그리고 한 번에 '모든 테스트코드를 짜봐야지' 하고 짜면 절대 제대로 짤 수 없다는걸 깨달았다. 차곡차곡 쌓는게 중요한것 같다.

 

 

Comments