파이썬에서는 내장 모듈인 unittest을 통해서 다른 라이브러리 없이 비교적 간단하게 단위 테스트를 작성할 수 있습니다.
unittest 모듈은 java의 JUnit, javascript의 jest 또는 Mocha와 같은 단위 테스트 프레임 워크입니다. 다만 다른 언어와 달리 기본적으로 언어에 내장되어 있기 때문에 파이썬만 설치가 되엉 ㅣㅆ다면 바로 모듈을 불러와서(import) 사용할 수 있습니다.
unittest 모듈의 TestCase 클래스는 단위 테스트에 필요한 다양한 유틸리티 메소드를 제공합니다. 따라서 새로운 테스트를 작성 할 때는 TestCase 클래스를 상속하는 클래스를 먼저 작성해야합니다. 그리고 그 클래스 안에 테스트를 수행하는 로직을 메서드로 추가해주면 됩니다.
예를 들어 1과 2를 더해서, 3이 나오는지를 검증하는 테스트는 다음과 같이 작성할 수 있습니다.
여기서 주의 할 점은 테스트 메소드의 이름은 반드시 test로 시작을 해야 합니다. 그래야 테스트를 실행할 때 해당 메서드가 누락되지 않고 정확히 테스트케이스로 인식이 됩니다.
작성한 테스트는 터미널에서 간단하게 실행해볼 수 있습니다.
unittest 모듈의 TestCase 클래스는 assertEqual 말고도 assert로 시작하는 많은 메서드를 제공합니다. 그 중에서 많이 쓰이는 메서드를 이용해서 테스트를 추가로 작성해보았습니다.
이를 토대로 제가 작성한 unit test입니다.
from django.test import Client, TestCase
from .models import MainCategory, Drink, SubCategory, Image, Size, Nutrition
class DrinkListTest(TestCase):
def tearDown(self):
MainCategory.objects.all().delete()
Drink.objects.all().delete()
SubCategory.objects.all().delete()
Image.objects.all().delete()
Size.objects.all().delete()
Nutrition.objects.all().delete()
class DrinkListTest(TestCase):
maxDiff = None
def setUp(self):
self.client = Client()
self.category = MainCategory.objects.create(name="음료")
self.coldbrew = SubCategory.objects.create(name="콜드브루", description="우리 사랑하자", main_category=self.category)
self.brudcoffee = SubCategory.objects.create(name="브루드 커피", description="더 사랑하자", main_category=self.category)
self.size_1 = Size.objects.create(name="Tall(톨)")
self.size_2 = Size.objects.create(name="regular(레귤러)")
self.nitro = Drink.objects.create(sub_category = self.coldbrew,
korean_name = "나이트로 바닐라 크림",
english_name = "Nitro Vanilla Cream",
main_description = "사랑해",
sub_description = "더 사랑해",
destiny = 10,
is_new = True,
is_season = False,
price = 1000)
self.icecoffee = Drink.objects.create(sub_category = self.brudcoffee,
korean_name = "아이스 커피",
english_name = "Iced Coffee",
main_description = "사랑해",
sub_description = "더 사랑해",
destiny = 15,
is_new = False,
is_season = False,
price = 3500)
self.nutrition = Nutrition.objects.create(drink = self.nitro,
size = self.size_1,
kcal = 10,
sodium = 15,
saturation= 20,
sugar = 25,
protein = 30,
caffeine = 35
)
self.nutrition = Nutrition.objects.create(drink = self.nitro,
size = self.size_2,
kcal = 20,
sodium = 30,
saturation= 40,
sugar = 50,
protein = 60,
caffeine = 70
)
self.nutrition = Nutrition.objects.create(drink = self.icecoffee,
size = self.size_1,
kcal = 100,
sodium = 150,
saturation= 200,
sugar = 250,
protein = 300,
caffeine = 350
)
self.nutrition = Nutrition.objects.create(drink = self.icecoffee,
size = self.size_2,
kcal = 200,
sodium = 300,
saturation= 400,
sugar = 500,
protein = 600,
caffeine = 700
)
self.image = Image.objects.create(image_url ="drink_image_url",
drink = self.icecoffee
)
self.image = Image.objects.create(image_url ="drink_image_url",
drink = self.nitro
)
def test_product_list_get_success(self):
response = self.client.get('/product')
self.assertEqual(response.status_code, 200)
self.assertEqual(response.json(),
{
'results':
[
{
'subcategory_id': 3,
'name': '콜드브루',
'description': '우리 사랑하자',
'products':
[
{
'id': 3,
'isnew': True,
'isseason': False,
'name': '나이트로 바닐라 크림',
'image': 'drink_image_url',
'kcal': 10,
'sodium': 15,
'saturation': 20,
'sugar': 25,
'protein': 30,
'caffeine': 35
}
]
},
{
'subcategory_id': 4,
'name': '브루드 커피',
'description': '더 사랑하자',
'products': [
{
'id': 4,
'isnew': False,
'isseason': False,
'name': '아이스 커피',
'image': 'drink_image_url',
'kcal': 100,
'sodium': 150,
'saturation': 200,
'sugar': 250,
'protein': 300,
'caffeine': 350
}
]
}
]
}
)
def test_product_list_get_filter_success(self):
name = "콜드브루"
response = self.client.get(f'/product?name={name}')
self.assertEqual(response.status_code, 200)
print(response.json())
self.assertEqual(response.json(),
{
'results': [
{
'subcategory_id': 1,
'name': '콜드브루',
'description': '우리 사랑하자',
'products': [
{
'id': 1,
'isnew': True,
'isseason': False,
'name': '나이트로 바닐라 크림',
'image': 'drink_image_url',
'kcal': 10,
'sodium': 15,
'saturation': 20,
'sugar': 25,
'protein': 30,
'caffeine': 35
}
]
}
]
}
)