2009-10-20 19 views
15

我主要是一個Ruby人,但最近我一直在研究很多Python的東西,特別是App Engine代碼。在Ruby中,我會在開發過程中使用自動化持續集成(autotest),代碼覆蓋工具(rcov),靜態分析(reek)和突變測試(heckle),但我不確定如何最好地設置App Engine環境的類似開發過程。對於可以在App Engine中工作的Python,我也會對RSpecCucumber感興趣。如何使用Google App Engine設置TDD開發流程?

+3

在Ruby社區中形成的TDD文化絕對讓人驚歎 – 2009-10-20 00:48:08

回答

15

在我的GAE項目中,我使用:

  • NoseGAE —這是結合所有的關鍵部分其餘的一起
  • 模擬,如約翰的優秀答案。我用這主要是出於AWS和其他網絡服務
  • 配件(包,而不是想法)

我還喜歡很多的Rails的成語。我將測試分解爲單元,並使用Python包進行功能性測試。您可以使用--tests=unit--tests=functional運行一個測試子集。這些都比Rails手動多一點,但至少我可以單元測試困難的東西,並確保我從來沒有迴歸。

我還做了一個簡單的FunctionalTest類來完成Rails中很多常見的操作,比如assert_responseassert_xpath(類似於assert_select)。

class FunctionalTest(Test): 
    def get(self, *args, **kw): 
    self.response = app.get(*args, **kw) 

    def post(self, *args, **kw): 
    self.response = app.post(*args, **kw) 

    def assert_response(self, expected): 
    pattern = str(expected) if re.search(r'^\d+$', expected) \ 
          else (r'^\d+ %s' % expected) 
    assert re.search(pattern, self.response.status, re.IGNORECASE), \ 
      'Response status was not "%s": %s' % (expected, self.response.status) 

    def assert_xpath(self, path, expected): 
    element = ElementTree.fromstring(self.response.body) 
    found_nodes = element.findall('.' + path) 
    if type(expected) is int: 
     assert_equal(expected, len(found_nodes)) 
    elif type(expected) is str or type(expected) is unicode: 
     assert (True in [(node.text == expected) for node in found_nodes]) 
    else: 
     raise Exception, "Unknown expected value: %r" % type(expected) 

如果你正在做大量的ListElement平等搜索,肯定學--tests=foo語法,因爲測試列表中匹配的元素是很慢的。

有時候我喜歡將Rails控制檯加載到我的燈具數據上以查看測試環境中發生了什麼(即script/console test)。做GAE類似的東西,使用參數--datastore_path="$TMPDIR/nosegae.datastore"運行dev_appserver.py(或可能替代/tmp$TMPDIR

+0

接受這個答案的關鍵NoseGAE位信息,雖然約翰的回答也非常有幫助。 – 2009-10-23 04:08:09

+0

謝謝,鮑勃!事實上,我計劃在未來將更多約翰的建議融入我自己的項目中。 – JasonSmith 2009-10-23 10:31:17

+0

Bob,回顧一下我的代碼,我發現我有辦法針對NoseGAE創建的數據存儲庫運行普通的SDK服務器,所以我將其添加爲最後一段。 – JasonSmith 2009-10-26 04:35:30

26

你不會總是在Python中找到一對一的Ruby測試工具,但是Python中有一些很棒的測試工具。我發現有用的一些工具包括:

  • unittest - Python標準庫中包含的xUnit工具。它包含了單元測試的所有基礎知識。
  • doctest - 標準庫的一個很棒的部分,它允許你在函數,類,模塊,方法的文檔字符串中編寫測試。它在傳達預期的API使用方面非常出色。 Ian Bicking建議使用doctest進行行爲驅動開發。 Doctest非常適合Sphinx文檔系統(您可以確保每次構建文檔時都會傳遞文檔中的所有示例)。
  • nosepy.test被視爲單元測試的下一代版本。他們可以運行所有現有的單元測試案例,但允許更簡單,非基於類的單元測試。 py.test也允許分佈式執行。
  • mock是一個很好的嘲笑行爲庫。
  • tdaemon監視目錄以更新您的代碼,並將重新執行您的測試套件。 (我的personal branch包含一些未完成的改進)。
  • BuildbotBitten,甚至Hudson都可以作爲Python代碼的全功能持續集成服務器。
  • coverage.py計算代碼的代碼覆蓋率。
  • pylint將對您的代碼提供類似皮棉的分析,確保它遵循常見的編碼約定並且沒有任何常見的錯誤。還有一個「更輕」的分析工具,PyFlakes
  • 有很多HTTP/Browser測試工具可以在Python中很好地運行,包括Twill,SeleniumWindmill

如果您在App Engine上使用Django,則它包含several extensions以允許您模擬HTTP客戶端和數據庫持久性。

還有很多其他工具我沒有用過(如PySpecBehaviour),這也可能有幫助。我還沒有看到Python中的任何突變測試工具,但我敢打賭有一個(我很想知道它是什麼)。

快樂測試!

+3

僅收藏該問題的回答 – 2009-10-20 01:33:42

+0

這裏有很多很棒的鏈接我猜很多這些都不是下拉菜單,但我希望看到更多的答案,詳細說明他們如何將事情與GAE的開發環境整合在一起,特別是在OS X發射器。 – 2009-10-20 02:12:11

+1

鮑勃,約翰的回答確實很棒。正如我剛纔所說的,一旦你安裝了NoseGAE插件,它就可以很順利地與所有這些工具一起航行。 – JasonSmith 2009-10-21 03:12:54

3

沒有使用App Engine的,但我對最流行的Python測試工具的感覺是

  • unittest/doctest是Python標準 庫的測試包。 unittest是python的xUnit。
  • nose是測試跑步者/取景器。它有很多選擇,包括 --with-coverage,它使用coverage給你代碼覆蓋 報告。
  • pylint是python中功能最強大的皮棉檢查工具。有用的 語法檢查器,因爲它建議未使用的變量/函數,當 方法應該是功能,等等。
  • pester(突變檢測)
  • buildbot(持續集成)

你可能會想引用的Python Testing Tools這(不是很完整)列表。

對於BDD來說,我上次檢查時該字段很薄。許多真正的BDD工具 不適用於鼻子和/或太限制它們所需的語法。 你可能對spec有一些好運,這是一個類似於BDD的鼻子插件。 剛發現pyccuracy,看起來很像黃瓜,但我沒有 試過。

爲了什麼它的價值,我現在只是用nosetests -v(鼻子亞軍與 --verbose),其中會使用到文檔字符串的第一行中的測試運行 輸出。也就是說,給定像一個測試:

class TestFoo(unittest.TestCase): 
    def testAnyNameHere(self): 
     """ Foo should be bar""" 
     foo = "bar" 
     self.assertEqual(foo, 'bar') 

nosetests會給:

$ nosetests -v 
Foo should be bar... ok 

----------------------------- 
Ran 1 tests in 0.002s 
OK 
+0

+1對於糾纏提及 – 2009-10-20 01:31:51

相關問題