0

我真的很困惑在本地嘗試數據存儲的方式。請給我一分鐘解釋。概念,使用和測試當地的雲數據存儲

我正在開發一個應用程序組成一些只有gae應用程序的微服務。在應用程序的一部分中,我使用數據存儲區。所以,當我運行我的應用程序時,我使用了開發服務器,當我在數據存儲區中保存某些調用某種方法的東西時,我可以完全看到gae的管理門戶網站中的實體。

好吧,現在,我不是直接調用ndb庫和他的方法,而是通過ndb構建一個小型庫來抽象他的功能性,然後我可以調用insertUser()而不是直接用ndb工作。所以,當我嘗試測試我建立的這個小型庫時(我已經寫了一個test.py文件來完成這個工作),問題就出現了。 起初,我認爲這不可行,因爲這個測試是在沒有運行deveserver的情況下執行的。在我搜索了關於如何模擬本地數據存儲區的信息之後,我發現了這一點,但是在我發現本地存根單元測試後,現在我什麼也不懂。

我都試過(gcloud datastore emulatorstub with unittest),我不明白這樣做簡單的例子: 我想測試一個實體保存在數據存儲後,我想測試我可以讀這個實體

我假設dev_server(在SDK中)模擬數據存儲(因爲我可以在那裏看到我的實體列表),但是爲什麼在本地開發中使用數據存儲模擬器呢?然後,爲什麼需要將存根用於數據存儲有一個數據存儲模擬器來做我想要的所有測試?我不明白。

我明白,也許我的問題是比代碼更多的概念,但我需要了解真正的權利如何處理這個最好的方式。

回答

0

最後我想我解決了並理解了我的問題。如果我正在使用其他要連接到雲數據存儲的系統,則需要使用「模擬器」。但不是我的情況。所以,我需要使用單元測試的存根,因爲沒有一個簡單的方法(我認爲是不可能的)對dev_server(當他正在運行時)執行此操作。 但我發現兩個主要問題:

第一,導入google_appengine庫的方式,因爲在文檔中不是很清楚,(在我看來),最終搜索用戶的意見,我發現「我的解決方案是東西像這樣「:

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 

第二次是當我執行測試(中爲數不多的我有一個)下一個單元測試失敗,例如,當在第一單元測試,我保存數據,並在第二我測試數據是否使用讀取方法正確保存。

當我初始化datastore_v3_stub時,我使用save_changes=True來指定我希望這些更改是永久性的,但是當我使用它時,不工作,我發現這些更改可能不會保存。

之後,我在測試文檔中發現了param datastore_file,當我用這個並指定一個文件保存暫時數據庫時,所有的測試都開始正常工作。

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

另外,我添加了一個最後的條件(unittest library)來刪除這個文件,所以我在測試結束時擦除了這個文件。 (避免在下次執行時出錯)。

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

我覺得GAE和所有谷歌雲平臺是快速發展的應用程序很好的解決方案,但我想太多,他們需要修改和擴展自己的文檔,特別是對無專家程序員(像我一樣)。 我希望這個解決方案可能有助於某人,如果你認爲我有一些錯誤,請評論它。