我想写一些py.测试测试基于this Tutorial创建的2个简单sqlalchemy ORM类的代码。问题是,如何在py.测试到测试数据库并在测试完成时回滚所有更改?是否可以模拟数据库并运行测试而不实际连接到de database?在
以下是我的课程代码:
from sqlalchemy import create_engine, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker, relationship
eng = create_engine('mssql+pymssql://user:pass@host/my_database')
Base = declarative_base(eng)
Session = sessionmaker(eng)
intern_session = Session()
class Author(Base):
__tablename__ = "Authors"
AuthorId = Column(Integer, primary_key=True)
Name = Column(String)
Books = relationship("Book")
def add_book(self, title):
b = Book(Title=title, AuthorId=self.AuthorId)
intern_session.add(b)
intern_session.commit()
class Book(Base):
__tablename__ = "Books"
BookId = Column(Integer, primary_key=True)
Title = Column(String)
AuthorId = Column(Integer, ForeignKey("Authors.AuthorId"))
Author = relationship("Author")
我通常是这样做的:
我没有用模型声明实例化引擎和会话,而是只声明一个没有绑定的基:
我只在需要的时候用
^{pr2}$您可以通过不在
add_book
方法中使用intern_session
而使用session
参数来实现相同的目的。在它使代码更易于测试,因为现在可以在调用方法时通过所选的会话。 而且,您不再被绑定到硬编码数据库url的会话所困扰。
使用其^{} hook 向pytest添加一个自定义的
dburl
选项。在只需将其添加到顶层
conftest.py
:现在您可以运行
pytest dburl <url of the test database>
然后可以从^{} 夹具中检索
dburl
选项此时,您可以:
db_url
在每个测试中都要这样做是相当混乱的,所以您可以充分利用pytest fixture来简化这个过程。在
以下是我使用的一些固定装置:
使用
db_session
夹具,您可以为每个单独的测试获得一个新鲜而干净的db_session
。 当测试结束时,db_session
被回滚,保持数据库的干净。在相关问题 更多 >
编程相关推荐