2009-11-18 15 views
37

我即將着手開發一些基於Python的大型App Engine項目,我認爲在提交單元測試策略之前,我應該檢查Stack Overflow的「人羣智慧」。我有一個現有的單元測試框架(基於unittest,具有自定義的選項和擴展名),所以任何「重量級」/「侵入性」的東西如nose,webtestgaeunit似乎都不合適。在我的世界觀中,重要的單元測試是非常輕量級和快速的,在極短的時間內運行,所以我可以不停地運行它們,而不會影響我的開發節奏(例如,對於不同的項目,我可以一個20K線項目的覆蓋率達到了97%左右,其中有幾十次超快速測試,總體運行時間爲5-7秒,這是一個典型的運行時間 - 這就是我認爲的一個體面的小型快速單元測試套件,測試)。我會有更豐富/更重的測試,當然還有通過硒或風車進行集成測試,這是不是我問的是什麼;-) - 我關注這個問題(以及我的大多數開發工作;-)是在小而輕的單元測試中輕輕地超快地覆蓋我的代碼,而不是更深的代碼。您在App Engine上使用了哪些輕量級Python單元測試?

所以,我認爲我需要什麼本質上是一組不同的關鍵應用程序引擎子系統的小,非常輕便模擬 - 數據存儲,內存緩存,請求/響應對象和調用Web應用程序處理,用戶處理,郵件,& c,大致按照這種優先順序。我還沒有找到我正在尋找的東西,所以在我看來,我應該依靠mox,就像我過去經常做的那樣,這基本上意味着嘲笑在給定測試中使用的每個子系統,並設置所有的期望& c(強,但每次都有很多工作,並且對被測試代碼的內部非常敏感,即非常「白匣子」),或者滾動我自己對每個子系統的模擬(並且在模擬的子系統上進行斷言'作爲單元測試的一部分)。鑑於GAE的Python端強大的「存根」架構,後者似乎是可行的,但我不相信我需要推出自己的,也就是說,沒有人已經寫過這種頭腦簡單的模擬器!)例如,對於數據存儲,它看起來像我所需要的或多或少是已經是SDK一部分的「存檔數據存儲」存根(stub),另外還有一種方法來標記它是隻讀和易於使用的訪問器,用於斷言關於數據存儲的狀態;子系統 - 每個子系統似乎都需要比SDK中的「多一點」,「位於現有」存根「架構之上」。因此,在潛入並花費一兩天寶貴的開發時間爲單元測試目的「滾動我自己的」GAE子系統模擬之前,我想我會仔細檢查一下SO人羣,看看你們是什麼樣的人羣想想這個...或者,如果已經有一些現有的這類模擬器的開源集合,我可以簡單地重複使用(或者最小化調整!),並且我在搜索時沒有發現它們! - )

編輯:澄清,如果我確實推出我自己的產品,我打算在可行的情況下利用SDK提供的存根;但是例如,對於最初從文件讀入但最終未保存的數據存儲沒有存根,因此我需要對現有的存根進行子類化和調整(它也不提供特別方便的方法來對其進行斷言狀態 - 與郵件服務存根相同,等等)。這就是我所說的「我自己的滾動」 - 不是「從頭開始重寫」 - )

編輯:「爲什麼不GAEUnit」 - GAEUnit是自己的使用情況不錯,但運行dev_appserver,看到導致我的瀏覽器(甚至通過urllib。urlopen)絕對不是我所追求的 - 我想使用一個完全自動化的設置,適合在基於擴展unittest的現有測試運行框架內運行,並且沒有HTTP方式(所述框架定義了「快速「的測試,除了其他的東西沒有套接字和最小的磁盤I/O - 我們模擬或模擬這些 - 所以通過gaeunit我可以沒有比」中等「測試更好)+沒有方便的方式預填充每個數據存儲測試(並且沒有OO結構來幫助定製事物)。

+0

2014年人羣意見是什麼? – andruso 2014-02-16 08:31:37

+0

@andrusr多年來我一直很開心地使用'google.appengine.ext.testbed'。 – 2015-01-04 20:06:45

回答

13

您不需要編寫自己的存根(stub) - SDK包含它們,因爲它們是模擬生產API的用途。並不是所有的都適用於單元測試,但大多數都是。查看this code獲取您需要使用內置存根的設置/拆卸代碼示例。

+1

當然,我打算在可行的情況下利用SDK提供的存根;但是例如,對於最初從文件讀入但最終未保存的數據存儲沒有存根,因此我需要對現有的存根進行子類化和調整(它也不提供特別方便的方法來對其進行斷言狀態 - 與郵件服務存根相同,等等)。這就是我所說的「滾動我自己」(讓我編輯問題來添加此說明!)。 – 2009-11-18 15:24:35

+1

儘管如此,您指向的代碼是一個很好的示例,說明如何組織stubbing(以及很好的OO以便於進一步定製),因此絕對要感謝,並且+1!) – 2009-11-18 15:41:46

+0

對於前者,您可以在刪除數據存儲文件之後測試,或者在測試之前複製它。或者,如果您只是需要初始數據,請在設置功能中填充數據存儲區。斷言數據存儲的狀態僅僅是運行查詢和檢查結果的情況 - 但是,其他存根不友好,因此我對它們的評論並非都適用於單元測試。 – 2009-11-18 15:49:34

4

我將GAEUnit用於我的Google App Engine應用程序,我對測試的速度感到非常滿意。我喜歡GAEUnit的東西,我確信Webtest可以做到這一點,它創建了自己的版本,用於測試的所有東西的存根,只剩下你的「實時」版本用於測試。

因此,當您運行GAETests時,您可能用於開發的數據存儲將保持原樣。

+1

運行dev_appserver並在我的瀏覽器(甚至通過urllib.urlopen)看到結果絕對不是我所追求的 - 我想要使用完全自動化的設置,適合在現有的基於擴展單元測試,並沒有HTTP的方式(所說的框架定義了一個「快速」測試,除了其他的東西沒有套接字和最小的磁盤I/O - 我們模擬或模擬這些 - 所以通過gaeunit我可以做得更好比「中等」測試)+沒有方便的方式爲每個測試預填充數據存儲(並且沒有OO結構來幫助定製事物)。 – 2009-11-18 15:37:14

+0

它仍然是一個很好的框架,可以滿足其他需求(中等加上半集成測試,**需要HTTP往返,但不是風車的全部重量),所以,謝謝,還有+1 ;-) – 2009-11-18 15:38:30

5

NoseGAE是一款支持單元測試的插件,通過爲您自動設置開發環境和測試數據存儲來支持unittests。在dev_appserver上開發時非常有用。

3

我可能還補充說Fixture在我的單元測試中非常有用。它允許您使用聲明性語法創建模型,並將其轉換爲可以加載到測試中的存儲實體。這樣您就可以在每個測試用例的開頭都設置相同的數據!這樣您就不必在每次測試開始時手動創建數據。下面是一個例子,從燈具文檔: 鑑於這種模式:

from google.appengine.ext import db 

class Entry(db.Model): 
    title = db.StringProperty() 
    body = db.TextProperty() 
    added_on = db.DateTimeProperty(auto_now_add=True) 

你的燈具應該是這樣的:

from fixture import DataSet 

class EntryData(DataSet): 
    class great_monday: 
     title = "Monday Was Great" 
     body = """\ 
Monday was the best day ever. 
""" 

不過請注意,我遇到了以下問題: 1。 This bug,但附帶的補丁確實可以補救它。 2.測試用例之間的數據存儲不是默認重置的。所以我用這個來強制重置爲每個測試案例:

class TycoonTest(unittest.TestCase): 
    def setUp(self): 
     # Clear out the datastore before starting the test. 
     apiproxy_stub_map.apiproxy._APIProxyStubMap__stub_map['datastore_v3'].Clear()  
     self.data = self.load_data() 
     self.data.setup() 
     os.environ['SERVER_NAME'] = "dev_appserver" 
     self.after_setUp() 

    def load_data(self): 
     return datafixture.data(*dset.__all__) 

    def after_setUp(self): 
     """ After setup 
     """ 
     pass 

    def tearDown(self): 
     # Teardown data. 
     try: 
      self.data.teardown() 
     except: 
      pass 
+0

嗯。不知道爲什麼這是downvoted。 – mahmoud 2010-08-22 19:58:44

0

由於1.3.1 version of SDK還有就是內置的unit test framework

它是Java的唯一正確的,但現在我覺得喜歡:

  1. 是多少你在你的問題談論相同的(和更多 - 如運行在雲中,例如測試)
  2. 和這是完全可能的端口\使用SDK實現Python的同一

那麼,這是否框架的作者 - Max Ross,他明確地告訴我們在他的I/O呈現"Testing techniques for Google App Engine"

有沒有人有任何關於此主題的更新?

相關問題