我有一个 FastAPI + SQLAlchemy 项目,我正在使用 Pytest 为 API 编写单元测试。
在每个测试函数中,我使用 SQLAlchemy 在一些表(用户表、帖子表、评论表等)中创建一些数据。每个测试功能中创建的这些数据将在测试功能完成后保留在表中,并会影响其他测试功能。
例如,在第一个测试函数中,我创建了 3 个帖子和 2 个用户,然后在第二个测试函数中,这 3 个帖子和 2 个用户仍然保留在表中,这使得我的测试预期错误。
以下是我的 pytest 固定装置:
@pytest.fixture
def session(engine):
Session = sessionmaker(bind=engine)
session = Session()
yield session
session.rollback() # Removes data created in each test method
session.close() # Close the session after each test
我使用
session.rollback()
删除会话期间所有创建的数据,但它不会删除数据。
以下是我的测试功能:
class TestAllPosts(PostBaseTestCase):
def create_logged_in_user(self, db):
user = self.create_user(db)
return user.generate_tokens()["access"]
def test_can_api_return_all_posts_without_query_parameters(self, client, session):
posts_count = 5
user_token = self.create_logged_in_user(session)
for i in range(posts_count):
self.create_post(session)
response = client.get(url, headers={"Authorization": f"Bearer {user_token}"})
assert response.status_code == 200
json_response = response.json()
assert len(json_response) == posts_count
def test_can_api_detect_there_is_no_post(self, client, session):
user_token = self.create_logged_in_user(session)
response = client.get(url, headers={"Authorization": f"Bearer {user_token}"})
assert response.status_code == 404
在最新的测试函数中,我没有得到 404,而是通过 5 个帖子得到了 200(来自上一个测试函数)
测试功能完成后如何删除每个测试功能中创建的数据?
提交事务后,您无法回滚到提交之前的状态。 根据 ACID 原则中的持久性,一旦提交事务,回滚将不会影响已提交的数据: https://dba.stackexchange.com/questions/188653/rollback-after-commit
所以你应该手动删除这些记录。