Django - 單元測試的小概念
第一次寫單元測試的時候,就是看著官方文件還有到處查來的技術文章吸收、了解並拼湊出測試的樣貌。
寫了兩個簡單需要使用資料庫的測試,但是出現問題了!
雖然翻遍google之後改寫解決問題了,仍然百思不得其解,決定上Django users求助。
(其實有時候我是有點懼怕問問題的... #畢竟被人嘴過不好好查#或是沒半個人回你#不知道自己是不是問了蠢問題或是沒有仔細檢查BUG)
Q: 為什麼我單獨執行都不會出錯,一起執行後,SecondTest抱錯說找不到對應的User呢?
後來我改成這個樣子,就順順的。
A:
Django在執行TestCase的時候,會預先建立一個假的/暫時的(虛擬的?)資料庫,
在執行各項測試期間所寫入的資料都會被存放在這個資料庫內,等到所有test cases都跑完之後,才會摧毀這個暫時的資料庫。
如同一般我們用的資料庫一樣,pk隨著每一筆新增的資料而累加。
所以囉,SecondTest要取用User,自然不是用pk = 1來取得!
但其實Django在執行單元測試時候,本就不會按照順序執行,所以用pk來取得資料也不是一個好方法,取而代之的是,將資料物件賦值給類別參數,如cls.user。
另外,setUpTestData也會在每個測試結束後就被砍掉了唷。
感謝nm的回答。我真的是痛哭流涕,因為我以為這次又要流局了...
附上我的原問題
寫了兩個簡單需要使用資料庫的測試,但是出現問題了!
雖然翻遍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的回答。我真的是痛哭流涕,因為我以為這次又要流局了...
附上我的原問題
留言
張貼留言