2013-12-19 17 views
1

我正在使用NoseGAE爲我的App Engine應用程序編寫本地單元測試,但某些測試突然出現問題。我有標準的setUp和tearDown函數,但是有一個測試似乎因爲我無法辨別的原因而中斷。即使是陌生人,setUp和tearDown也不會每次都被調用。我添加了全局變量來計算setUp/tearDown調用,並且在我的第四個測試(現在看起來已經損壞的測試)上,setUp被調用了兩次,而tearDown被調用了一次。此外,當我通過id查詢它時,第三個測試中的一個對象存在,但不存在於其類型的一般查詢中。下面是一些代碼,讓奇異的畫面:App Engine + NoseGAE怪異破損測試

class GameTest(unittest.TestCase): 
    def setUp(self): 
     self.testapp = webtest.TestApp(application) 
     self.testbed = testbed.Testbed() 
     self.testbed.activate() 
     self.testbed.init_datastore_v3_stub(
      consistency_policy=datastore_stub_util.PseudoRandomHRConsistencyPolicy(probability=1), 
      require_indexes=True, 
      root_path="%s/../../../" % os.path.dirname(__file__) 
     ) 

    def tearDown(self): 
     self.testbed.deactivate() 
     self.testapp.cookies.clear() 

    def test1(self): 
     ... 

    def test2(self): 
     ... 

    def test3(self): 
     ... 
     # I create a Game object with the id 123 in this particular test 
     Game(id=123).put() 
     ... 

    def test4(self): 
     print "id lookup: ", Game.get_by_id(123) 
     print "query: ", Game.query().get() 
     self.assertIsNone(Game.get_by_id(123)) 

這是測試的抽象,但足以說明問題。

第4次測試失敗,因爲它聲稱具有該ID的對象不存在。當我打印出來的兩個語句:

ID查找:遊戲(鍵=鍵( '遊戲',123))

查詢:無

的ID查找顯示TEST3創建的對象,但查詢查詢是EMPTY。這對我來說絕對沒有意義。此外,我100%肯定測試工作在早些時候。有誰知道這甚至有可能嗎?我可能有一些本地損壞的文件導致問題?

+1

我從來沒有能夠使用NDB正常工作,除非我使用--with-sandbox運行nosetests。它以奇怪和混亂的方式失​​敗,看起來沒有一貫的理由......我希望有人能夠給出一個體面的答案,但嘗試這個選擇可能會幫助你。 – Greg

+0

感謝格雷格,但我應該提到,我已經用該標誌運行它。 –

+0

這是一種期望的行爲,假設「PseudoRandomHRConsistencyPolicy」的概率設置爲<1。您是否可以斷言您的策略是按照您的預期啓動的? – Josh

回答

0

我有點「解決」了這一點。只有在其他失敗的文件中有其他測試用例時纔會複製此問題。一旦我解決了這些,我的所有測試都通過了。我仍然不完全明白爲什麼其他失敗的測試會導致測試平臺出現這些奇怪的問題,但對於有此問題的任何其他人,請先嚐試修復其他測試用例,看看是否不會導致它消失。