簡體   English   中英

測試postgres db python

[英]testing postgres db python

我不明白如何測試我的存儲庫。

我想確保我真的將所有參數保存到數據庫中,當我執行我的SQL語句時,我真的收到了我應該的。

但是,我不能在unittest case的setUp方法中放置"CREATE TABLE test_table ”,因為它將被多次創建(同一測試用例的測試並行運行)。 所以,只要我在同一個類中創建需要在同一個表上工作的2個方法,它就不起作用(表的名稱沖突)

同樣,我不能把"CREATE TABLE test_table" setUpModule ,因為現在表創建了一次,但是由於測試是並行運行的,所以沒有什么能阻止多次將同一個對象插入到我的表中,從而打破了unicity約束一些領域。

同樣,我不能在每個方法中"CREATE SCHEMA some_random_schema_name" ,因為我需要為給定的數據庫全局“SET search_path TO ...”,因此並行運行的每個方法都會受到影響。

我看到的唯一方法是為每個測試創建"CREATE DATABASE" ,並使用唯一的名稱,並建立與每個數據庫的invidual連接..這看起來非常浪費。 有沒有更好的辦法?

另外,我不能在內存中使用SQLite,因為我需要測試PostgreSQL。

對此最好的解決方案是使用testing.postgresql模塊。 這將在用戶空間中觸發數據庫,​​然后在運行結束時再次刪除它。 您可以將以下內容放在unittest套件中 - 在setUpsetUpClasssetUpModule - 取決於您想要的持久性:

import testing.postgresql

def setUp(self):
    self.postgresql = testing.postgresql.Postgresql(port=7654)
    # Get the url to connect to with psycopg2 or equivalent
    print(self.postgresql.url())

def tearDown(self):
    self.postgresql.stop()

如果您希望數據庫在測試之間/之后保持base_dir ,您可以使用base_dir選項運行它來設置目錄 - 這將阻止它在關閉后被刪除:

name = "testdb"
port = "5678"
path = "/tmp/my_test_db"
testing.postgresql.Postgresql(name=name, port=port, base_dir=path)

在測試之外,它還可以用作上下文管理器,在退出with塊時它將自動清理和關閉:

with testing.postgresql.Postgresql(port=7654) as psql:
    # do something here

暫無
暫無

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

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