簡體   English   中英

使用Python的ATDD Google App Engine-密鑰問題

[英]ATDD Google App Engine with Python - Trouble with Keys

我對這個問題的處理方式可能是完全錯誤的,因此請隨時進行更正。 我還在問題標題中添加了ATDD,因為我正在嘗試測試Web api的輸出,而不僅僅是單元測試。

我在用:

  • Google App Engine 1.7.1
  • GAE高復制數據存儲
  • Python 2.7.3

我使用樣板代碼設置測試:

self.testbed = testbed.Testbed()
self.testbed.activate()
self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(probability=0)
self.testbed.init_datastore_v3_stub()

然后,我調用一個模擬對象設置程序來設置我的實體並將其持久保存到測試平台數據存儲中。 我使用一個計數器添加5個具有artist_id 1-5的藝術家:

def add_mock_artist_with(self, artist_id, link_id, name):
    new_artist = dto.Artist(key_name=str(artist_id),
        name=name,
        link_id= str(link_id))
    new_artist.put()

我的測試是我的Web API返回:

{
    "artists": [
            {
            "artist": {
                "name": "Artist 1",
                "links": {
                    "self": {
                        "href": "https://my_server.com/artist/1/"
                    }
                }
            }
        },
.
.
.      
            {
            "artist": {
                "name": "Artist 5",
                "links": {
                    "self": {
                        "href": "https://my_server.com/artist/5/"
                    }
                }
            }
        }
    ],
    "links": {
        "self": {
            "href": "https://my_server.com/artists/"
        }
    }
}

最初我以為如果每次運行測試時都要啟動一個新的測試台,我可以指望我的藝術家被順序輸入到數據存儲中,因此會獲得ID 1-5。我的測試最初通過了,但是隨着時間的流逝由於ID不匹配而開始失敗(我將獲得一個鏈接,例如:“ href”:“ https://my_server.com/artist/78/”)。 我對依序生成ID感到有些內,因此我決定修復它。 我偶然發現了密鑰的概念,它可以是名稱,也可以是生成的ID。 我更新了模板,以使用返回的JSON:

artist.key().id_or_name()

對於模擬對象,我在構造時提供了鍵名:

key_name=str(artist_id) 

對於非模擬構造,我不包括該行代碼,而是讓GAE分配ID。

由於我的模板使用key()。id_or_name()輸出屬性,因此一切順利,測試通過了。

但是,現在,當我測試可以通過http://my_server.com/artist/5/獲得的單個藝術家的退貨時,我的測試失敗。 要將演出者從數據存儲區中取出,我使用以下代碼:

def retrieve_artist_by(id):
    artist = dto.Artist.get_by_id()

在生產中,這將很好地工作,因為它們都是基於id的。 但是,在我的測試中,沒有找到任何東西,因為我在模擬構造中使用了key_name = str(artist_id),並且名稱與id不同。

我希望有類似的東西:

artist = dto.Artist.get_by_id_or_name()

有任何想法嗎?

也許不是您要找的答案,但是有可能找出您是在生產服務器還是部署服務器上運行並執行不同的代碼路徑。

在Python中,如何測試我是否在Google App Engine SDK中? http://code.google.com/appengine/docs/python/runtime.html#The%5FEnvironment

os.environ['SERVER_SOFTWARE'].startswith('Development')

這是我現在正在使用的。 我不喜歡它,但是它應該在產品中表現出色,因為我將使用生成的ID。 在測試中,如果找不到通過id的名稱,它將嘗試按名稱查找。

def retrieve_artist_by(id):
    artist = dto.Artist.get_by_id(id)

    if artist is None:
        artist = dto.Artist.get_by_key_name(str(id))


    return artist

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM