UnitTest

12702 ワード

Pythonでは、モジュールunittestを統合することで、他のライブラリを必要とせずにユニットテストを簡単に作成できます.

ユニットテストモジュール


unittestモジュールは、JavaのJUnit、JavaScriptのjest、Mochaなどのユニットテストフレームワークです.ただし、他の言語と異なり、デフォルトでは言語に組み込まれているため、Pythonのみをインストールする場合はモジュールを直接ロードして使用することができます(import).

TestCaseクラス


ユニットテストモジュールのTestCaseクラスは、ユニットテストのためのさまざまなユーティリティメソッドを提供します.したがって、新しいテストを作成するときは、まずTestCaseクラスを継承するクラスを作成する必要があります.その後、テストを実行するロジックをメソッドとしてクラスに追加できます.
たとえば、プラス1と2が3であるかどうかを確認するために、次のテストを作成できます.

テストメソッドの名前はtestで始まる必要があります.これにより、テストを実行するときにメソッドが失われず、テストケースとみなされます.

テストの実行


作成したテストを端末で簡単に実行できます.

テストに失敗しました



Assetionメソッド


unittestモジュールのTestCaseクラスは、assertEqualではなくassertで始まる多くの方法を提供します.一般的な方法の1つを使用して、他のテストを作成しました.




これに基づいて、ユニットテストを作成しました.
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
                                                            }
                                                            ]
                                                            }
                                                        ]
                                        }
        )