概念,使用和测试本地的云数据存储

时间:2016-06-10 10:05:34

标签: python unit-testing google-app-engine google-cloud-datastore

我真的很困惑在本地尝试数据存储的方式。请给我一点时间解释一下。

我正在开发一个由少数微服务组成的应用程序,例如唯一的应用程序。在应用程序的一部分中,我使用数据存储区。因此,当我运行我的应用程序时,我使用开发服务器,当我在数据存储区中保存一些调用某种方法时,我可以在gae的管理Web门户中完美地看到该实体。

好吧,现在,我没有直接调用ndb库和他的方法,而是在ndb上构建了一个小型库来抽象他的函数,然后我可以调用insertUser()而不是直接使用ndb。因此,当我尝试测试我构建的这个小型库时,会出现问题(我已经编写了一个test.py文件来执行此操作)。 起初,我认为这不起作用,因为这个测试是在没有运行deveserver的情况下执行的。在我搜索了有关如何在本地模拟数据存储区的信息之后我发现了这一点,但是在我发现了本地的单元测试与存根之后,现在我什么都不懂。

我已尝试过两者(gcloud datastore emulatorstub with unittest)并且我没有做简单的例子: 我想测试一个实体保存在数据存储区中,在我想要测试后我可以读取这个实体

我认为dev_server(在SDK中)模拟数据存储区(因为我可以在那里看到我的实体列表),但是,为什么在本地开发中使用数据存储模拟器?然后,为什么需要如果我们有一个数据存储模拟器来执行我想要的所有测试,那么使用存根到数据存储区?我不明白。

我明白,也许我的问题更多的是概念而不是代码,但我需要理解正确的最佳方法是如何使用它。

1 个答案:

答案 0 :(得分:0)

最后我想我解决了并理解了我的问题。如果我正在使用其他想要连接到Cloud Datastore的系统,我需要使用"模拟器"。但不是我的情况。所以,我需要使用带有unittest的存根,因为没有一种简单的方法(我认为是不可能的)用dev_server(当他运行时)这样做。 但我发现了两个主要问题:

首先,导入google_appengine库的方法,因为在文档中并不是很清楚,(在我看来),最后搜索用户意见我发现"我的解决方案是这样的&#34 ;:

sys.path.insert(1, '../../../../google_appengine')

if 'google' in sys.modules:
    del sys.modules['google']

from google.appengine.ext import ndb
from google.appengine.ext import testbed

第二个是当我执行一个测试(我的一个中的一个)时,下一个单元测试失败,例如,在第一个单元测试中,我保存数据,在第二个单元测试中测试数据是否正确保存用read方法。

当我初始化datastore_v3_stub时,我使用save_changes=True指定我希望更改是永久性的,但是当我使用它时,不能正常工作,我发现这些更改可能不会发生变化保存。

之后,我在tesbed docs中找到了param datastore_file,当我使用它并指定一个文件,其中保存暂时数据库时,所有测试都开始正常工作。

self.testbed.init_datastore_v3_stub(enable=True, save_changes=True, datastore_file='./dbFile')

此外,我添加了一个最终条件(unittest库)来删除这个文件,所以,我在测试结束时擦除文件。 (避免在下次执行中出错)。

@classmethod
def tearDownClass(self):
    """
    Elimina el fichero de la bd temporal tras la ejecución de todos los tests.
    """
    os.remove('./dbFile')

我认为GAE和所有Google Cloud Platform都是开发快速应用程序的非常好的解决方案,但我认为他们需要修改和扩展他的文档,特别是对于没有专家的程序员(像我一样)。 我希望这个解决方案可以帮助别人,如果你认为我有一些错误,请评论它。