ATDD带Python的Google应用程序引擎-按键有问题
我对这个问题的看法可能是完全错误的,所以请不要犹豫改正它。我还在问题标题中添加了ATDD,因为我正在尝试测试我的web api的输出,它比一个单元测试更大 我正在使用:ATDD带Python的Google应用程序引擎-按键有问题,python,unit-testing,google-app-engine,Python,Unit Testing,Google App Engine,我对这个问题的看法可能是完全错误的,所以请不要犹豫改正它。我还在问题标题中添加了ATDD,因为我正在尝试测试我的web api的输出,它比一个单元测试更大 我正在使用: 谷歌应用引擎1.7.1 高复制数据存储 Python 2.7.3 我使用样板代码设置测试: self.testbed = testbed.Testbed() self.testbed.activate() self.policy = datastore_stub_util.PseudoRandomHRConsistencyP
- 谷歌应用引擎1.7.1
- 高复制数据存储
- 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位艺术家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_或_name()输出属性,所以一切顺利,测试通过
然而,现在当我测试一位艺术家的回归时,我的测试失败了。为了从数据存储中抓取艺术家,我使用以下代码:
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()
有什么想法吗?也许不是您要寻找的答案,但是可以确定您是否在生产或部署服务器上运行,并执行不同的代码路径
这是我现在正在使用的。我不喜欢它,但它应该在prod中执行,因为我将使用生成的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
谢谢保罗,但我不想脱离环境,这很公平。仅供参考,应用程序引擎中不支持Python 2.7.3,仅支持2.7.2。
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