0

この質問に対する私のアプローチは完全に間違っている可能性があるため、遠慮なく修正してください。単体テストよりも大きな Web API の出力をテストしようとしているため、質問のタイトルにも ATDD を追加しました。

私は使っている:

  • Google App Engine 1.7.1
  • GAE 高レプリケーション データストア
  • パイソン 2.7.3

定型コードを使用してテストをセットアップします。

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

次に、モック オブジェクトのセットアップを呼び出してエンティティをセットアップし、それらをテストベッド データストアに永続化します。カウンターを使用して、artist_id 1 ~ 5 の 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()

何か案は?

4

2 に答える 2

0

これが私が今使っているものです。私はそれが好きではありませんが、生成されたIDを使用するので、prodでパフォーマンスが高いはずです。テストでは、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
于 2012-09-23T14:48:06.903 に答える
0

探している答えではないかもしれませんが、運用サーバーまたは展開サーバーで実行しているかどうかを確認し、別のコード パスを実行することは可能です。

Python では、Google App Engine SDK を使用しているかどうかをテストするにはどうすればよいですか? http://code.google.com/appengine/docs/python/runtime.html#The%5FE環境

os.environ['SERVER_SOFTWARE'].startswith('Development')
于 2012-09-20T09:37:28.060 に答える