製品詳細ビュー[unit test]プロセス

50542 ワード

次のユニットテストコードを作成します.
製品詳細ページ情報を取得するロジックを実施しているからです.
もちろん、このロジックのユニットテストを作成するときに、製品のテーブルも作成しました.その結果、製品が参照している内容が不明であることがわかりました.
上記の問題を解決するために、
Productが参照する関係テーブルはcreateでディレクトリデータを生成することもできます
A:だから、productはサブカテゴリを指します.
サブカテゴリはcategoryを参照します.
categoryはmenuを参照します.
=>>得られた教訓:ユニットテストのためにネックデータを生成すると、
あまりデータは必要ありません.
作成された論理を表すのに十分なデータを生成することができます.3~4個でもOK
作成した論理がテーブル参照の関係に関係している場合は、
情報がどのように成長しているかを考慮し、その関係と関係間のforeinkeyを考慮して作成順序を設定してください.
(以下、menu->category->サブカテゴリ->product->画像順ではないと書き間違えました.
互いにforeinkeyの関係を理解し合います!)

  • import json
    
    from django.http import response
    from django.test import TestCase, Client
    
    from products.models import Category, Image, Menu, Product, SubCategory
    
    class ProductDetailTest(TestCase):
        def setUp(self):
            self.client = Client()
            
            Menu.objects.create(
                name = '홈'
            )
    
            Category.objects.create(
                name = '옷',
                menu = 1
            )
    
            SubCategory.objects.create(
                name = '상의',
                Category = 1
            )
    
            Image.objects.create(
                image_url = 'http:상품1이미지',
                product = 1
            )
    
            # Image.objects.create(
            #     image_url = 'http:상품1이미지',
            #     product = 1
            # )
    
            Image.objects.create(
                image_url = 'http:상품2이미지',
                product = 2
            )
    
            Image.objects.create(
                image_url = 'http:상품3이미지',
                product = 3
            )
    
            Image.objects.create(
                image_url = 'http:상품4이미지',
                product = 4
            )
    
            Product.objects.create(
                id = 1,
                name = '상품1',
                price = 1111111,
                brand = 'zara',
                description = '상품1설명입니다',
                thumbnail_image_url = 'http:상품1썸네일이미지'
            )
    
            Product.objects.create(
                id = 2,
                name = '상품2',
                price = 222222,
                brand = 'zara2',
                description = '상품2설명입니다',
                thumbnail_image_url = 'http:상품2썸네일이미지'
            )  
    
            Product.objects.create(
                id = 3,
                name = '상품3',
                price = 333333,
                brand = 'zara3',
                description = '상품3설명입니다',
                thumbnail_image_url = 'http:상품3썸네일이미지'
            )  
    
            Product.objects.create(
                id = 4,
                name = '상품4',
                price = 444444,
                brand = 'zara4',
                description = '상품4설명입니다',
                thumbnail_image_url = 'http:상품4썸네일이미지'
            )  
    
        def tearDown(self):
            Product.objects.all().delete()
    
        def test_productdetailview_get_success(self):
            client = Client()
            # result = {
            #             'name' : '상품1',
            #             'price' : 1111111,
            #             'brand' : 'zara',
            #             'description' : '상품1설명입니다',
            #             'thumbnail_image_url' : 'http:상품1썸네일이미지',
            #             'image_url' : 'http:상품1이미지'          
            #         }
            response = client.get('/product/1')
            self.assertEqual(response.json(),
                {
                    "messagee" : {
                            'name' : '상품1',
                            'price' : 1111111,
                            'brand' : 'zara',
                            'description' : '상품1설명입니다',
                            'thumbnail_image_url' : 'http:상품1썸네일이미지',
                            'image_url' : 'http:상품1이미지'
                        }
                    
                    # "result" : [
                    #     {'message':1},
                    #     {'message':2},
                    #     {'message':3},
                    #     {'message':4},
                    #     {'message':5}
                    # ],
                }
            )
            self.assertEqual(response.status_code, 200)

    Q:上のコードにもエラーはありません-->画像のforginkey…?
    そんな間違いが起こる
    A:イメージはproductを参照しますが、Imageというクラスを作成するためにprodcutを作成していません.
    imageを作成するときに必須要素image urlとproduct idを作成しません...エラーを解決するためにproductを作成してからimageを作成すると、参照の関係は一致しません.

  • 1つのエージェントIDのうち2つの噛まれたイメージをテストする場合、1つのイメージを超えるとエラーが発生します.
    import json
    
    from django.http import response
    from django.test import TestCase, Client
    
    from products.models import Category, Image, Menu, Product, SubCategory
    
    class ProductDetailTest(TestCase):
        def setUp(self):
            self.client = Client()
    
            Menu.objects.create(
                name = '홈'
            )
            
            Category.objects.create(
                name = '옷',
                menu_id = 1
            )
           
            SubCategory.objects.create(
                name = '상의',
                category_id = 1
            )
            
            Product.objects.create(
                id = 1,
                name = '상품1',
                price = '1111111.00',
                brand = 'zara',
                description = '상품1설명입니다',
                thumbnail_image_url = 'http:상품1썸네일이미지',
                sub_category_id = 1 
            )
           
            Product.objects.create(
                name = '상품2',
                price = '222222.00',
                brand = 'zara2',
                description = '상품2설명입니다',
                thumbnail_image_url = 'http:상품2썸네일이미지',
                sub_category_id = 1
            )  
          
            Product.objects.create(
                id = 3,
                name = '상품3',
                price = '333333.00',
                brand = 'zara3',
                description = '상품3설명입니다',
                thumbnail_image_url = 'http:상품3썸네일이미지',
                sub_category_id = 1
            )  
            
            Product.objects.create(
                id = 4,
                name = '상품4',
                price = '444444.00',
                brand = 'zara4',
                description = '상품4설명입니다',
                thumbnail_image_url = 'http:상품4썸네일이미지',
                sub_category_id = 1
            )  
           
            Image.objects.create(
                image_url = 'http:상품1이미지',
                product_id = 1
            )
           
            Image.objects.create(
                image_url = 'http:상품5이미지',
                product_id = 1
            )
         
            Image.objects.create(
                image_url = 'http:상품2이미지',
                product_id = 2
            )
            
            Image.objects.create(
                image_url = 'http:상품3이미지',
                product_id = 3
            )
            
            Image.objects.create(
                image_url = 'http:상품4이미지',
                product_id = 4
            )
            
        def tearDown(self):
            Product.objects.all().delete() 
    
        def test_productdetailview_get_success(self):
            client = Client()
            response = client.get('/product/1')
            self.assertEqual(response.json(),
                {
                    "message" : {
                            'name' : '상품1',
                            'price' : '1111111.00',
                            'brand' : 'zara',
                            'description' : '상품1설명입니다',
                            'thumbnail_image_url' : 'http:상품1썸네일이미지',
                            'image_url' : ['http:상품1이미지']
                    }
                }
            )
            self.assertEqual(response.status_code, 200)
    

    作成済み
  • のProductDetailView関数の成功セルテスト
  • を作成します.
    def test_productdetailview_get_success(self):
            client = Client()  #--> 이부분은 다시 이해해야함
            response = client.get('/product/1') #--> url이 product
            self.assertEqual(response.json(),
                {
                    "message" : {
                            'name' : '상품1',
                            'price' : '1111111.00',
                            'brand' : 'zara',
                            'description' : '상품1설명입니다',
                            'thumbnail_image_url' : 'http:상품1썸네일이미지',
                            'image_url' : ['http:상품1이미지', 'http:상품5이미지']
                    }
                }
            )
            self.assertEqual(response.status_code, 200)
    
  • 失敗

  • 成功
  • アイテムidは5次ディレクトリデータを生成する.objects.create()が作成されていません.作成できません.
    未作成の商品をロードすると、楽加disnotexistがコードを記述し、エラーが発生します.
    実在する4番と存在しない5番なら


    昨日作った部分が正確に作られ接続されていることを確保するために、
    途中印刷物で確認してみました.
    class ProductDetailTest(TestCase):
        def setUp(self):
            self.client = Client()
    
            Menu.objects.create(
                name = '홈'
            )
    
            print(1)
    
            Category.objects.create(
                name = '옷',
                menu_id = 1
            )
    
            print(2)
    
            SubCategory.objects.create(
                name = '상의',
                category_id = 1
            )
    
            print(3)
    
            Product.objects.create(
                id = 1,
                name = '상품1',
                price = '1111111.00',
                brand = 'zara',
                description = '상품1설명입니다',
                thumbnail_image_url = 'http:상품1썸네일이미지',
                sub_category_id = 1 
            )
    
            print(4)
    
            Product.objects.create(
                id = 2,
                name = '상품2',
                price = '222222.00',
                brand = 'zara2',
                description = '상품2설명입니다',
                thumbnail_image_url = 'http:상품2썸네일이미지',
                sub_category_id = 1
            )  
    
            print(5)
    
            Product.objects.create(
                id = 3,
                name = '상품3',
                price = '333333.00',
                brand = 'zara3',
                description = '상품3설명입니다',
                thumbnail_image_url = 'http:상품3썸네일이미지',
                sub_category_id = 1
            ) 
    
            print(6)
    
            Product.objects.create(
                id = 4,
                name = '상품4',
                price = '444444.00',
                brand = 'zara4',
                description = '상품4설명입니다',
                thumbnail_image_url = 'http:상품4썸네일이미지',
                sub_category_id = 1
            )  
    
            print(7)
    
            Image.objects.create(
                image_url = 'http:상품1이미지',
                product_id = 1
            )
    
            print(8)
    
            Image.objects.create(
                image_url = 'http:상품5이미지',
                product_id = 1
            )
    
            print(9)
            
            Image.objects.create(
                image_url = 'http:상품2이미지',
                product_id = 2
            )
    
            print(10)
    
            Image.objects.create(
                image_url = 'http:상품3이미지',
                product_id = 3
            )
    
            print(11)
    
            Image.objects.create(
                image_url = 'http:상품4이미지',
                product_id = 4
            )
    
            print(12)
    
        def tearDown(self):
            Menu.objects.all().delete()
            SubCategory.objects.all().delete()
            Category.objects.all().delete()
            Product.objects.all().delete()
            Image.objects.all().delete()
    
            print(13)
    
        def test_product_detail_view_get_success(self):
            client = Client()
            response = client.get('/products/1')
            self.assertEqual(response.json(),
                {
                    'message' : {
                            'name' : '상품1',
                            'price' : '1111111.00',
                            'brand' : 'zara',
                            'description' : '상품1설명입니다',
                            'thumbnail_image_url' : 'http:상품1썸네일이미지',
                            'image_url' : ['http:상품1이미지', 'http:상품5이미지']
                    }
                }
            )
            self.assertEqual(response.status_code, 200)
    
            print(14)
    
        def test_product_detail_view_get_doesnotexist(self):
            client = Client()
            response = client.get('/products/5')
            self.assertEqual(response.json(),
                {'message': 'PRODUCT_DOESNOT_EXIST'}
            )
            self.assertEqual(response.status_code, 400)
    
            print(15)
    やはり

    forein keyに関するエラーが発生しました

    表示されている1-13は、私がprintと書いた痕跡です.
    私がユニットテストを記述する順序でprint(13)部分に途中でエラーがない順序で記述されていることがわかります.
    それでもエラーが発生しました

    ....何か問題がありますか...?
    私が作成したユニットテストコードでcreateでデータを作成すると、
    製品データの作成時のみ
    id値コードを記述し、他のMenu、SubCategory、Category、Imageデータを生成する場合、id値コードは記述されない…
    ここに現れた問題を発見した.
    その問題は?
    上記のid値コードを記述していない部分では、id値がcreate時に自動的に一意の値を生成すると思って記述していませんが、これらのid値を作成しtestに戻ります.
    知らず知らずのうちに起こった間違いが消えて、okが起こった...
    だから原因は解決したけど...
    ただ理由が分からない.
    その理由はもう少しgooglingをすることです...指導者から助けてもらいたい.
    その問題を発見したのは木曜日です.金曜日はまず制作ユニットテストのため...
    結局私は土曜日の朝から指導者のところに行って彼の理由を聞いた.ハハハハ、ごめんなさい.ほほほ
    はい、指導者の助けを得て、私は原因を知っています......ああ...ジャム続き...
    ユニットテストを実行するときは、ディレクトリデータを作成し、テスト1番関数を実行し、削除、再作成、テスト2番関数を実行し、削除します.これをテストするたびに、作成→テスト関数の実行→削除→テスト関数の作成→テスト関数の実行→削除の順に行います.
    私は製品にid値しか設定していませんが、残りのMenu、SubCategory、Category、Imageを作成するときはid値は設定していません.
    新しいオブジェクトを削除して作成する場合、id値のデータは削除されませんが、削除後に生成されたid値はdbで順番にプッシュされることが確認されている可能性があります.
    その原理は同様に適用される.
    ユニットテスト時にid値を指定することでid値の強制設定を行う
    foreinkeyのSubCategory、Category、Product、Imageで参照されているid値は同じですが、unitテキストを行うと固有のid値が見つからないので、このforeinkeyはわかりません...ううう
    理由を知ってよかったよ
    なぜ私は製品を生成する時だけid値を作成するのか分かりませんが、原因と原因が分かっているので嬉しいです^^