Django - 單元測試的小概念

第一次寫單元測試的時候,就是看著官方文件還有到處查來的技術文章吸收、了解並拼湊出測試的樣貌。
寫了兩個簡單需要使用資料庫的測試,但是出現問題了!
雖然翻遍google之後改寫解決問題了,仍然百思不得其解,決定上Django users求助。
(其實有時候我是有點懼怕問問題的... #畢竟被人嘴過不好好查#或是沒半個人回你#不知道自己是不是問了蠢問題或是沒有仔細檢查BUG)


class FirstTest(TestCase):



    @classmethod

    def setUpTestData(cls):

       User.objects.create(username = 'johndoe', password = 'goodtobehere123')

       ...



    def test_case_one(self):

       user = User.objects.get(pk=1)

       # some assertions here





class SecondTest(TestCase):



    @classmethod

    def setUpTestData(cls):

        User.objects.create(username = 'janedoe', password = 'nicetobethere456')



    def test_case_one(self):

       user = User.objects.get(pk=1)

       # some assertions here



Q: 為什麼我單獨執行都不會出錯,一起執行後,SecondTest抱錯說找不到對應的User呢?



後來我改成這個樣子,就順順的。


class FirstTest(TestCase):



    @classmethod

    def setUpTestData(cls):

        cls.user = User.objects.create(username = 'johndoe', password = 'goodtobehere123')

        ...



    def test_case_one(self):

       self.assertEqual(self.user.somefunc(), something)

       # some assertions here



       ...



class SecondTest(TestCase):



    @classmethod

    def setUpTestData(cls):

       cls.user = User.objects.create(username = 'janedoe', password = 'nicetobethere456')

       ...



    def test_case_one(self):

       self.assertEqual(self.user.somefunc(), something)

       # some assertions here



       ...





A:
Django在執行TestCase的時候,會預先建立一個假的/暫時的(虛擬的?)資料庫,
在執行各項測試期間所寫入的資料都會被存放在這個資料庫內,等到所有test cases都跑完之後,才會摧毀這個暫時的資料庫。
如同一般我們用的資料庫一樣,pk隨著每一筆新增的資料而累加。
所以囉,SecondTest要取用User,自然不是用pk = 1來取得!
但其實Django在執行單元測試時候,本就不會按照順序執行,所以用pk來取得資料也不是一個好方法,取而代之的是,將資料物件賦值給類別參數,如cls.user。
另外,setUpTestData也會在每個測試結束後就被砍掉了唷。



感謝nm的回答。我真的是痛哭流涕,因為我以為這次又要流局了...



附上我的原問題



留言

這個網誌中的熱門文章

Django - admin 的設定筆記

[Python] 以folium製作臺灣百岳資訊地圖

交個筆友吧!老派的浪漫與科技之結合 - SLOWLY