在python中使用peewee和postgres进行并行数据库测试

时间:2014-12-11 00:01:06

标签: python postgresql integration-testing cherrypy peewee

我正试图对我的数据库集成测试进行并列化,但是我没有成功。我正在使用樱桃,peewee,postgres和nosetest。

我的基本模型(每个实体都来自这个):

 class BaseModel(Model):
    class Meta:
        database = manager.get_db()  # Link this to the loaded database.

我的经理类看起来像那样(经理(小写)是DbManager的单例实例)):

class DbManager(object):
    db = None

    def initialize_db(self):
        return PooledPostgresqlExtDatabase(None, max_connections=10, threadlocals=True, register_hstore=False)

    def get_db(self):
        if not self.db:
            self.db = self.initialize_db()
        return self.db

我的基础数据库测试(修补是指前面提到的单例管理器实例):

class BaseServiceTest(unittest.TestCase):
    _multiprocess_shared_ = True

    def setUp(self):
        self.begin_patch = patch('manager.db.begin')
        self.begin_mock = self.begin_patch.start()

        self.commit_patch = patch('manager.db.commit')
        self.commit_mock = self.commit_patch.start()

        self.rollback_patch = patch('manager.db.rollback')
        self.rollback_mock = self.rollback_patch.start()

    def tearDown(self):
        self.rollback_patch.stop()
        self.commit_patch.stop()
        self.begin_patch.stop()
        manager.get_db().rollback()

在测试顶级 init .py文件中我正在设置数据库:

def set_up_database():
    settings = {
    "host": "127.0.0.1",
    "port": 5432,
    "name": "product_test",
    "user": "product_test",
    "password": None,
    'sslmode': 'disable'
    }
    load_db_only(settings)
    reset_db_only()

load_db_only使用指定的参数调用数据库初始化,reset_db创建必要的关系

问题是 - 数据是在测试之间共享的,所以当我运行并行测试时,我会遇到失败的约束(这封电子邮件已经存在等)。 我想要实现的只是在事务中使用数据(通常我的目标是让测试并行运行 - 所以任何其他建议都非常受欢迎):

  • 交易开始
  • 我在交易中放了一些测试数据
  • 测试运行(从事务处理中获取数据,更新等)
  • 交易回滚
  • 一切看起来我的测试从未发生过

所以最后我的问题是: 有谁知道如何实现这一目标?

0 个答案:

没有答案